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

C'è un modo per inserire un valore grande in un DB mysql senza modificare max_allowed_packet?

Di recente mi sono imbattuto in questo problema. Nel mio caso, il max_allowed_packet del server era 1 MB e non potevo fare nulla per cambiarlo. E stavo inserendo alcuni dati appena sopra 1 MB. Ho trovato due soluzioni candidate.

1) Innanzitutto, utilizzando JDBC.Since MySQL Connector/J v3.1.9 , ci sono alcuni parametri che puoi impostare, ecco il mio set di parametri nell'URL JDBC:

Aggiungi questi:

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

Risultato URL JDBC:

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

Quindi devi utilizzare PreparedStatement per fare i tuoi inserti e usa InputStream per passare il contenuto del byte come parametro a setObject . Nota che setObject l'utilizzo di matrici di byte non abiliterà la suddivisione del BLOB. La combinazione di parametri, server MySQL recente (5.0.45 o successivo) e InputStream invierà i dati del BLOB utilizzando LONG DATA meccanismo, suddividendo il BLOB in base a blobSendChunkSize .

La soluzione JDBC funziona e l'ho testata.

2) Ora, il secondo candidato è usare mysqli di PHP driver e usa mysqli_send_long_data . Per tua comodità, copiato dall'esempio del manuale PHP :

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