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