sql >> Databasteknik >  >> RDS >> Mysql

Finns det något sätt att infoga ett stort värde i en mysql DB utan att ändra max_allowed_packet?

Jag snubblade nyligen över detta problem. I mitt fall serverns max_allowed_packet var 1 MB och jag kunde inte göra något för att ändra det. Och jag infogade lite data strax över 1 MB. Jag hittade två lösningskandidater.

1) Använd först JDBC. Sedan MySQL Connector/J v3.1.9 , det finns några parametrar som du kan ställa in, här är min uppsättning parametrar i JDBC URL:

Lägg till dessa:

blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000

Resulterar i JDBC URL:

jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000

Då måste du använda PreparedStatement för att göra dina infogningar och använd InputStream för att skicka byteinnehållet som en parameter till setObject . Observera att setObject att använda byte-arrayer kommer inte att aktivera blob-delningen. Kombinationen av parametrar, senaste MySQL-server (5.0.45 eller senare) och InputStream kommer att skicka blobdata med LONG DATA mekanism, dela upp klumpen enligt blobSendChunkSize .

JDBC-lösningen fungerar och jag har testat den.

2) Nu, den andra kandidaten, är att använda PHPs mysqli drivrutin och använd mysqli_send_long_data . För din bekvämlighet, kopierat från PHP-manualexempel:

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


  1. Förstå index i MySQL:Del två

  2. Spara en bild i MySQL från Java

  3. 5 sätt att returnera rader som innehåller små bokstäver i SQL Server

  4. Problem med GROUP_CONCAT och Longtext i MySQL