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