sql >> Database teknologi >  >> RDS >> Mysql

Er der nogen måde at indsætte en stor værdi i en mysql DB uden at ændre max_allowed_packet?

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


  1. Sådan overfører du data fra en aktivitet til en java-klasse

  2. SQL ALTER DATABASE Syntaks – Listet efter DBMS

  3. Vis forældre-barn-relation, når forældre og barn er gemt i samme tabel

  4. FEJL 1005 (HY000):Kan ikke oprette tabel (fejlnr:150)