sql >> Base de Datos >  >> RDS >> Mysql

¿Hay alguna forma de insertar un valor grande en una base de datos mysql sin cambiar max_allowed_packet?

Recientemente me encontré con este problema. En mi caso, el max_allowed_packet del servidor era 1 MB y no pude hacer nada para cambiarlo. Y estaba insertando algunos datos justo por encima de 1 MB. Encontré dos soluciones candidatas.

1) Primero, usando JDBC. Dado que MySQL Connector/J v3.1.9 , hay algunos parámetros que podría establecer, aquí está mi conjunto de parámetros en la URL de JDBC:

Agregue estos:

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

Dando como resultado la URL de JDBC:

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

Entonces debes usar PreparedStatement para hacer sus inserciones, y use el InputStream para pasar el contenido del byte como parámetro a setObject . Tenga en cuenta que setObject el uso de matrices de bytes no habilitará la división de blobs. La combinación de parámetros, servidor MySQL reciente (5.0.45 o posterior) y InputStream enviará los datos del blob usando LONG DATA mecanismo, dividiendo el blob según blobSendChunkSize .

La solución JDBC funciona y la he probado.

2) Ahora, el segundo candidato es usar mysqli de PHP controlador y use mysqli_send_long_data . Para su comodidad, copiado del ejemplo del manual de 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();
?>