Jeg faldt for nylig over dette problem. I mit tilfælde serverens max_allowed_packet var 1 MB, og jeg kunne ikke gøre noget for at ændre det. Og jeg indsatte nogle data lige over 1 MB. Jeg fandt to løsningskandidater.
1) Først skal du bruge JDBC.Siden MySQL Connector/J v3.1.9 , der er et par parametre, du kan indstille, her er mit sæt parametre i JDBC URL:
Tilføj disse:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Resulterer i JDBC URL:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Så skal du bruge PreparedStatement for at lave dine indsættelser, og brug InputStream at videregive byteindholdet som en parameter til setObject . Bemærk at setObject Brug af byte-arrays vil ikke aktivere blob-opdelingen. Kombinationen af parametre, nyere MySQL-server (5.0.45 eller nyere) og InputStream vil sende blob-dataene ved hjælp af LONG DATA mekanisme, opdeler klatten i henhold til blobSendChunkSize .
JDBC-løsningen virker, og jeg har testet den.
2) Nu er den anden kandidat at bruge PHP's mysqli driver og brug mysqli_send_long_data . For nemheds skyld, kopieret fra PHP-manuel eksempel:
<?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();
?>