Saya baru-baru ini menemukan masalah ini. Dalam kasus saya, max_allowed_packet
server adalah 1 MB dan saya tidak dapat melakukan apa pun untuk mengubahnya. Dan saya memasukkan beberapa data tepat di atas 1 MB. Saya menemukan dua kandidat solusi.
1) Pertama, menggunakan JDBC. Sejak MySQL Connector/J v3.1.9 , ada beberapa parameter yang dapat Anda atur, inilah set parameter saya di URL JDBC:
Tambahkan ini:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Menghasilkan URL JDBC:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Maka Anda harus menggunakan PreparedStatement
untuk melakukan penyisipan, dan gunakan InputStream
untuk meneruskan konten byte sebagai parameter ke setObject
. Perhatikan bahwa setObject
menggunakan array byte tidak akan mengaktifkan pemisahan gumpalan. Kombinasi parameter, server MySQL terbaru (5.0.45 atau lebih baru), dan InputStream
akan mengirimkan data blob menggunakan LONG DATA
mekanisme, membelah gumpalan menurut blobSendChunkSize
.
Solusi JDBC berfungsi dan saya telah mengujinya.
2) Sekarang, kandidat kedua, adalah menggunakan mysqli PHP driver dan gunakan mysqli_send_long_data
. Untuk kenyamanan Anda, salin dari contoh manual 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();
?>