有没有办法在不改变max_allowed_数据包的情况下在mysql数据库中插入一个大值?

有没有办法在不改变max_allowed_数据包的情况下在mysql数据库中插入一个大值?,mysql,blob,Mysql,Blob,我知道,为了将大于max_allowed_packet字节的值插入MySQL数据库,默认的解决方案是确保客户端和服务器端max_allowed_packet变量都大于查询插入数据库的数据块 但是,有没有办法在不更改上述服务器端变量的情况下执行此操作?当我必须将数据插入ISP中托管的数据库时,这将非常有用,ISP不允许我更改max\u allowed\u数据包限制 另一个相关问题:MySqllongbloblimit是4GB,但是max\u allowed\u packetlimit是1GB。那么

我知道,为了将大于
max_allowed_packet
字节的值插入MySQL数据库,默认的解决方案是确保客户端和服务器端
max_allowed_packet
变量都大于查询插入数据库的数据块

但是,有没有办法在不更改上述服务器端变量的情况下执行此操作?当我必须将数据插入ISP中托管的数据库时,这将非常有用,ISP不允许我更改
max\u allowed\u数据包
限制


另一个相关问题:MySql
longblob
limit是4GB,但是
max\u allowed\u packet
limit是1GB。那么,是否可以在
longblob
表列中插入大于1GB的值?

我认为没有办法。也许把这团东西分开就行了

但是我认为阅读这篇来自Reymond Chen的文章是对你问题的最好回答


关系数据库不是为这种用途而设计的。如果您需要在数据库中存储一个千兆字节以上的blob,那么通常最好将其存储在NFS上,并且在数据库中只保留一个短的文件位置字符串。这将为你省去很多麻烦。

我最近偶然发现了这个问题。在我的例子中,服务器的
max\u allowed\u数据包
为1MB,我无法更改它。我插入了一些略高于1MB的数据。我找到了两个备选方案

1) 首先,使用JDBC。 自MySQL Connector/J v3.1.9以来,您可以设置一些参数,以下是我在JDBC URL中的一组参数:

jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
附加以下内容:

blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
产生JDBC URL:

jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
然后必须使用
PreparedStatement
进行插入,并使用
InputStream
将字节内容作为参数传递给
setObject
。请注意,
setObject
使用字节数组不会启用blob拆分。参数、最新MySQL服务器(5.0.45或更高版本)和
InputStream
的组合将使用
LONG data
机制发送blob数据,根据
blobSendChunkSize
拆分blob

JDBC解决方案可以工作,我已经对它进行了测试

2) 现在,第二个候选者是使用PHP的mysqli驱动程序并使用
mysqli\u send\u long\u data
。为方便起见,复制自PHP手册示例:

<?php
$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp)) {
    $stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();
?>


我的第二个问题更像是好奇,主要问题是第一个。我不想把一个3GB的blob放在一列中。。。我认为我的第一个问题与违反操作系统限制无关。我的意思是,当我无法更改此变量时,将2MB blob放在max_allowed_数据包仅为1MB的数据库中会很有用…只是尝试了mysqli在1MB max_allowed_数据包上存储27mb文件。真棒的回答,我们已经为此做了将近一周的工作。难道不能只为当前事务/连接设置这些参数吗?可能使用
设置…
?与更改JDBCURL相比,我更愿意这样做。仅添加这两个参数useServerPrepsmts=true&maxAllowedPacket=20000000时效果非常好。我看到'java.sql.SQLException:prepared语句的参数是通过mysql\u send\u long\u data()设置的,它比'max\u allowed\u packet'bytes'长,这在我使用blobSendChunkSize时很奇怪。我对此不熟悉,但我也有同样的问题。我想知道第一位候选人,如何使用
blobSendChunkSize=50000&useserverpresmts=true&emulateunsupportedpsmts=false&maxAllowedPacket=20000000
以及如何检查结果,如
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
帮助我所有人