一尘不染

有什么方法可以在不更改max_allowed_pa​​cket的情况下在mysql数据库中插入较大的值?

mysql

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

但是,是否有任何方法可以
更改上述服务器端变量?当我必须将数据插入ISP所托管的不允许更改max_allowed_packet限制的数据库中时,这将很有用。

另一个相关问题:MySql
longblob限制为4GB,但max_allowed_packet限制为1GB。那么,是否可以在longblob表列中插入大于1GB的值?


阅读 164

收藏
2020-05-17

共1个答案

一尘不染

我最近偶然发现了这个问题。在我的情况下,服务器的大小max_allowed_packet为1 MB,我无能为力。我插入的数据刚好超过1
MB。我找到了两个解决方案候选人。

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

附加以下内容:

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数据,并根据分割Blob blobSendChunkSize

JDBC解决方案有效,我已经对其进行了测试。

2)现在,第二个候选方法是使用PHP的 mysqli 驱动程序并使用mysqli_send_long_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();
?>
2020-05-17