Nedávno jsem narazil na tento problém. V mém případě max_allowed_packet
serveru byl 1 MB a nemohl jsem udělat nic, abych to změnil. A vkládal jsem nějaká data těsně nad 1 MB. Našel jsem dva kandidáty na řešení.
1) Nejprve pomocí JDBC.Since MySQL Connector/J v3.1.9 , existuje několik parametrů, které byste mohli nastavit, zde je moje sada parametrů v adrese URL JDBC:
Připojte tyto:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Výsledkem je JDBC URL:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Potom musíte použít PreparedStatement
pro vložení a použijte InputStream
pro předání obsahu bajtu jako parametru do setObject
. Všimněte si, že setObject
použití bajtových polí neumožní rozdělení objektů blob. Kombinace parametrů, nejnovější server MySQL (5.0.45 nebo novější) a InputStream
odešle data blob pomocí LONG DATA
mechanismus, rozdělující objekt blob podle blobSendChunkSize
.
Řešení JDBC funguje a vyzkoušel jsem ho.
2) Nyní je druhým kandidátem použití mysqli PHP ovladač a použijte mysqli_send_long_data
. Pro vaše pohodlí zkopírováno z příkladu manuálu 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();
?>