Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es eine Möglichkeit, einen großen Wert in eine MySQL-DB einzufügen, ohne max_allowed_packet zu ändern?

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