Recentemente me deparei com esse problema. No meu caso, o
max_allowed_packet
do servidor era de 1 MB e não pude fazer nada para alterá-lo. E eu estava inserindo alguns dados um pouco acima de 1 MBs. Encontrei dois candidatos a solução. 1) Primeiro, usando JDBC.Desde MySQL Connector/J v3.1.9 , existem alguns parâmetros que você pode definir, aqui está meu conjunto de parâmetros na URL JDBC:
Anexar estes:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Resultando na URL JDBC:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Então você deve usar
PreparedStatement
para fazer suas inserções e use o InputStream
para passar o conteúdo do byte como parâmetro para setObject
. Observe que setObject
o uso de matrizes de bytes não habilitará a divisão de blob. A combinação de parâmetros, servidor MySQL recente (5.0.45 ou posterior) e InputStream
enviará os dados do blob usando LONG DATA
mecanismo, dividindo o blob de acordo com blobSendChunkSize
. A solução JDBC funciona e eu a testei.
2) Agora, o segundo candidato, é usar o mysqli do PHP driver e use
mysqli_send_long_data
. Para sua conveniência, copiado do exemplo do manual do 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();
?>