Mysql
 sql >> Base de données >  >> RDS >> Mysql

Existe-t-il un moyen d'insérer une grande valeur dans une base de données mysql sans modifier max_allowed_packet ?

Je suis récemment tombé sur ce problème. Dans mon cas, le max_allowed_packet du serveur était de 1 Mo et je ne pouvais rien faire pour le changer. Et j'insérais des données juste au-dessus de 1 Mo. J'ai trouvé deux solutions candidates.

1) Tout d'abord, en utilisant JDBC.Depuis MySQL Connector/J v3.1.9 , vous pouvez définir quelques paramètres, voici mon ensemble de paramètres dans l'URL JDBC :

Ajoutez-les :

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

Résultat de l'URL JDBC :

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

Ensuite, vous devez utiliser PreparedStatement pour faire vos inserts, et utilisez le InputStream pour passer le contenu en octets en paramètre à setObject . Notez que setObject l'utilisation de tableaux d'octets n'activera pas le fractionnement de blob. La combinaison de paramètres, serveur MySQL récent (5.0.45 ou version ultérieure) et InputStream enverra les données blob en utilisant LONG DATA mécanisme, divisant le blob selon blobSendChunkSize .

La solution JDBC fonctionne et je l'ai testée.

2) Maintenant, le deuxième candidat, est d'utiliser mysqli de PHP pilote et utilisez mysqli_send_long_data . Pour votre commodité, copié à partir de l'exemple du manuel 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();
?>