Я недавно наткнулся на эту проблему. В моем случае max_allowed_packet
сервера был 1 МБ, и я ничего не мог сделать, чтобы изменить его. И я вставлял некоторые данные чуть больше 1 МБ. Я нашел два варианта решения.
1) Во-первых, используя JDBC.
Поскольку MySQL Connector / J v3.1.9 , есть несколько параметров, которые вы можете установить, вот мой набор параметров в URL JDBC:
Добавить эти:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
В результате URL JDBC:
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
, разбивая большой двоичный объект в соответствии с 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();
?>