sql >> Database >  >> RDS >> Mysql

Is er een manier om een ​​grote waarde in een mysql-database in te voegen zonder max_allowed_packet te wijzigen?

Ik stuitte onlangs op dit probleem. In mijn geval is het max_allowed_packet . van de server was 1 MB en ik kon niets doen om het te veranderen. En ik was wat gegevens aan het invoegen net boven de 1 MB. Ik heb twee oplossingskandidaten gevonden.

1) Gebruik eerst JDBC.Since MySQL Connector/J v3.1.9 , er zijn een paar parameters die je zou kunnen instellen, hier is mijn set parameters in de JDBC URL:

Voeg deze toe:

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

Resulterend in JDBC-URL:

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

Dan moet je PreparedStatement . gebruiken om uw invoegingen te doen, en gebruik de InputStream om de byte-inhoud als parameter door te geven aan setObject . Merk op dat setObject het gebruik van byte-arrays schakelt het splitsen van de blob niet in. De combinatie van parameters, recente MySQL-server (5.0.45 of hoger) en InputStream zal de blob-gegevens verzenden met LONG DATA mechanisme, waarbij de blob wordt gesplitst volgens blobSendChunkSize .

De JDBC-oplossing werkt en ik heb het getest.

2) Nu, de tweede kandidaat, is het gebruik van PHP's mysqli stuurprogramma en gebruik mysqli_send_long_data . Voor uw gemak gekopieerd uit een PHP-handboekvoorbeeld:

<?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. Hoe gebruik ik een globale tijdelijke tabel in de Oracle-procedure?

  2. De onderliggende kolommen van een weergave verkrijgen op basis van de resultatenset

  3. Oracle-client en netwerkcomponenten zijn niet gevonden

  4. SQL UPDATE-instructie om twee waarden in twee rijen te wisselen