我知道为了将大于max_allowed_packet
字节的值插入MySQL数据库,默认解决方案是确保客户端和服务器端max_allowed_packet
变量都大于查询插入数据库的数据块.
但是,有没有办法在不改变上面提到的服务器端变量的情况下这样做?当我必须将数据插入托管在不允许我更改max_allowed_packet
限制的ISP中的数据库时,这将非常有用.
另一个相关问题:MySql longblob
限制为4GB,但max_allowed_packet
限制为1GB.那么,是否可以在longblob
表格列中插入大于1GB的值?
Yud*_*ama 11
我最近偶然发现了这个问题.在我的情况下,服务器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
Run Code Online (Sandbox Code Playgroud)
导致JDBC URL:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Run Code Online (Sandbox Code Playgroud)
然后你必须使用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();
?>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6370 次 |
最近记录: |