我最近偶然發現了這個問題。在我的情況下,服務器的max_allowed_packet
是1 MB,我無法改變它。我插入的數據剛好在1 MB以上。我找到兩個解決方案候選人
1)首先,使用JDBC。 由於MySQL連接/ 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數據,根據blobSendChunkSize
拆分blob。
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();
?>
剛試過mysqli在1mb max_allowed_packet上存儲27mb文件。真棒回答,我們一直在爲此工作近一週。 – shmeeps 2011-08-19 19:47:46
不可能僅爲當前事務/連接設置這些參數嗎?也許使用'SET ...'?我更喜歡這改變JDBC URL。 – 2015-09-09 13:53:43
加入這兩個參數useServerPrepStmts = true&maxAllowedPacket = 20000000時效果很好。我看到'java.sql.SQLException:通過mysql_send_long_data()設置的準備語句的參數比'max_allowed_packet'字節'長,當我使用blobSendChunkSize時這很奇怪。 – Rishi 2017-08-03 23:52:57