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();
?>