Gần đây tôi đã tình cờ gặp vấn đề này. Trong trường hợp của tôi, max_allowed_packet của máy chủ là 1 MB và tôi không thể làm gì để thay đổi nó. Và tôi đã chèn một số dữ liệu chỉ trên 1 MB. Tôi đã tìm thấy hai ứng cử viên giải pháp.
1) Đầu tiên, sử dụng JDBC.Since MySQL Connector / J v3.1.9 , có một số tham số mà bạn có thể đặt, đây là tập hợp các tham số của tôi trong URL JDBC:
Nối những cái này:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Dẫn đến URL JDBC:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Sau đó, bạn phải sử dụng PreparedStatement để thực hiện các thao tác chèn của bạn và sử dụng InputStream để chuyển nội dung byte làm tham số cho setObject . Lưu ý rằng setObject sử dụng mảng byte sẽ không cho phép tách các đốm màu. Sự kết hợp của các tham số, máy chủ MySQL gần đây (5.0.45 trở lên) và InputStream sẽ gửi dữ liệu blob bằng LONG DATA cơ chế, tách blob theo blobSendChunkSize .
Giải pháp JDBC hoạt động và tôi đã thử nghiệm nó.
2) Bây giờ, ứng cử viên thứ hai, là sử dụng mysqli của PHP trình điều khiển và sử dụng mysqli_send_long_data . Để thuận tiện cho bạn, hãy sao chép từ ví dụ thủ công 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();
?>