Niedawno natknąłem się na ten problem. W moim przypadku max_allowed_packet
serwera miał 1 MB i nic nie mogłem zrobić, aby to zmienić. A ja wstawiałem trochę danych nieco powyżej 1 MB. Znalazłem dwóch kandydatów na rozwiązanie.
1) Najpierw użyj JDBC.Od MySQL Connector/J v3.1.9 , można ustawić kilka parametrów, oto mój zestaw parametrów w adresie URL JDBC:
Dołącz te:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Wynikowy adres URL JDBC:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Następnie musisz użyć PreparedStatement
zrobić swoje wstawki i użyć InputStream
przekazać zawartość bajtów jako parametr do setObject
. Zauważ, że setObject
użycie tablic bajtów nie włączy dzielenia obiektów blob. Kombinacja parametrów, najnowszy serwer MySQL (5.0.45 lub nowszy) i InputStream
wyśle dane blob za pomocą LONG DATA
mechanizm, dzielenie bloba zgodnie z blobSendChunkSize
.
Rozwiązanie JDBC działa i przetestowałem je.
2) Teraz drugim kandydatem jest użycie mysqli PHP sterownika i użyj mysqli_send_long_data
. Dla Twojej wygody, skopiowany z ręcznego przykładu 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();
?>