私は最近この問題に遭遇しました。私の場合、サーバーのmax_allowed_packet
1 MBで、変更することはできませんでした。そして、私は1MBのすぐ上にいくつかのデータを挿入していました。 2つのソリューション候補を見つけました。
1)まず、JDBCを使用します。 MySQLConnector / J v3.1.9 以降 、設定できるパラメータがいくつかあります。JDBCURLのパラメータのセットは次のとおりです。
これらを追加します:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
結果としてJDBCURLになります:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
次に、PreparedStatement
を使用する必要があります 挿入を行い、InputStream
を使用します バイトコンテンツをパラメータとしてsetObject
に渡します 。 setObject
に注意してください バイト配列を使用しても、blob分割は有効になりません。パラメータの組み合わせ、最近のMySQLサーバー(5.0.45以降)、およびInputStream
LONG DATA
を使用してBLOBデータを送信します メカニズム、blobSendChunkSize
に従ってblobを分割します 。
JDBCソリューションは機能し、テストしました。
2)2番目の候補は、PHPの mysqliを使用することです。 ドライバーとmysqli_send_long_data
を使用します 。便宜上、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();
?>