Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe alguma maneira de inserir um valor grande em um banco de dados mysql sem alterar max_allowed_packet?


Recentemente me deparei com esse problema. No meu caso, o max_allowed_packet do servidor era de 1 MB e não pude fazer nada para alterá-lo. E eu estava inserindo alguns dados um pouco acima de 1 MBs. Encontrei dois candidatos a solução.

1) Primeiro, usando JDBC.Desde MySQL Connector/J v3.1.9 , existem alguns parâmetros que você pode definir, aqui está meu conjunto de parâmetros na URL JDBC:

Anexar estes:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000

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

Então você deve usar PreparedStatement para fazer suas inserções e use o InputStream para passar o conteúdo do byte como parâmetro para setObject . Observe que setObject o uso de matrizes de bytes não habilitará a divisão de blob. A combinação de parâmetros, servidor MySQL recente (5.0.45 ou posterior) e InputStream enviará os dados do blob usando LONG DATA mecanismo, dividindo o blob de acordo com blobSendChunkSize .

A solução JDBC funciona e eu a testei.

2) Agora, o segundo candidato, é usar o mysqli do PHP driver e use mysqli_send_long_data . Para sua conveniência, copiado do exemplo do manual do 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();
?>