Recientemente me encontré con este problema. En mi caso, el max_allowed_packet
del servidor era 1 MB y no pude hacer nada para cambiarlo. Y estaba insertando algunos datos justo por encima de 1 MB. Encontré dos soluciones candidatas.
1) Primero, usando JDBC. Dado que MySQL Connector/J v3.1.9 , hay algunos parámetros que podría establecer, aquí está mi conjunto de parámetros en la URL de JDBC:
Agregue estos:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Dando como resultado la URL de JDBC:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Entonces debes usar PreparedStatement
para hacer sus inserciones, y use el InputStream
para pasar el contenido del byte como parámetro a setObject
. Tenga en cuenta que setObject
el uso de matrices de bytes no habilitará la división de blobs. La combinación de parámetros, servidor MySQL reciente (5.0.45 o posterior) y InputStream
enviará los datos del blob usando LONG DATA
mecanismo, dividiendo el blob según blobSendChunkSize
.
La solución JDBC funciona y la he probado.
2) Ahora, el segundo candidato es usar mysqli de PHP controlador y use mysqli_send_long_data
. Para su comodidad, copiado del ejemplo del manual de 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();
?>