Ich bin vor kurzem über dieses Problem gestolpert. In meinem Fall das max_allowed_packet
des Servers war 1 MB und ich konnte nichts tun, um es zu ändern. Und ich habe einige Daten knapp über 1 MB eingefügt. Ich habe zwei Lösungskandidaten gefunden.
1) Zuerst mit JDBC.Seit MySQL Connector/J v3.1.9 , gibt es ein paar Parameter, die Sie setzen könnten, hier ist mein Parametersatz in der JDBC-URL:
Hängen Sie diese an:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Ergebnis in JDBC-URL:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Dann müssen Sie PreparedStatement
verwenden um Ihre Einfügungen vorzunehmen, und verwenden Sie den InputStream
um den Byte-Inhalt als Parameter an setObject
zu übergeben . Beachten Sie, dass setObject
Die Verwendung von Byte-Arrays aktiviert die Blob-Aufteilung nicht. Die Kombination aus Parametern, aktuellem MySQL-Server (5.0.45 oder höher) und InputStream
sendet die Blob-Daten mit LONG DATA
Mechanismus, der den Blob gemäß blobSendChunkSize
aufteilt .
Die JDBC-Lösung funktioniert und ich habe sie getestet.
2) Der zweite Kandidat soll PHPs mysqli verwenden Treiber und verwenden Sie mysqli_send_long_data
. Der Einfachheit halber aus dem Beispiel des PHP-Handbuchs kopiert:
<?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();
?>