Mysql
 sql >> база данни >  >> RDS >> Mysql

Има ли някакъв начин да се вмъкне голяма стойност в mysql DB, без да се променя max_allowed_packet?

Наскоро попаднах на този проблем. В моя случай max_allowed_packet на сървъра беше 1 MB и не можах да направя нищо, за да го променя. И вмъквах някои данни малко над 1 MB. Намерих два кандидата за решение.

1) Първо, с помощта на JDBC.Since MySQL Connector/J v3.1.9 , има няколко параметъра, които можете да зададете, ето моят набор от параметри в URL адреса на JDBC:

Добавете тези:

blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000

В резултат на JDBC URL:

jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000

След това трябва да използвате PreparedStatement за да направите вашите вмъквания и използвайте InputStream за да предадете съдържанието на байта като параметър на setObject . Обърнете внимание, че setObject използването на масиви от байтове няма да позволи разделянето на blob. Комбинацията от параметри, скорошен MySQL сървър (5.0.45 или по-нова версия) и InputStream ще изпрати blob данните с помощта на LONG DATA механизъм, разделящ блоба според blobSendChunkSize .

Решението JDBC работи и аз го тествах.

2) Сега, вторият кандидат, е да използвате mysqli на PHP драйвер и използвайте mysqli_send_long_data . За ваше удобство, копирано от пример за ръководство на 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 с false като стойност по подразбиране?

  2. Вмъкването в mySQL на JSON кодирана стойност със специални знаци е неуспешна

  3. Как да експортирате / изхвърлите MySql таблица в текстов файл, включително имената на полета (известни още като заглавки или имена на колони)

  4. Как да изпълня UPSERT, така че да мога да използвам както нови, така и стари стойности в частта за актуализиране

  5. Актуализирайте заявката за актуализиране на редове в MySQL