Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy istnieje sposób na wstawienie dużej wartości w mysql DB bez zmiany max_allowed_packet?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql Query:Wybierz górne 3 wiersze z tabeli dla każdej kategorii

  2. WSTAW do ciągu DB DateTime

  3. MySQL JOIN i COUNT w jednym zapytaniu

  4. Związane z PHP PDO:Aktualizuj instrukcję SQL, która nie aktualizuje zawartości bazy danych

  5. Instrukcja MySQL Select i IF()