sql >> Databáze >  >> RDS >> Mysql

Existuje nějaký způsob, jak vložit velkou hodnotu do databáze mysql bez změny max_allowed_packet?

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


  1. Odstranit pomocí více tabulek a opakovat tabulku v dílčím dotazu

  2. Existují nějaké metody, které pomáhají při řešení běžných problémů SQLite?

  3. Získání popisovače pro nativní Oracle Connection v Hibernate 4 pro spuštění uloženého proc

  4. Jak vytvořit instalaci MySQL pro lokální testování