【问题标题】:Cant send long data to msql MEDIUMTEXT or MEDIUMBLOB无法将长数据发送到 mysql MEDIUMTEXT 或 MEDIUMBLOB
【发布时间】:2016-03-22 12:19:36
【问题描述】:

我只能在字符串包含 523264 个字符时发送数据。帮助!

include("conn.php");

$stmt = $conn->prepare("INSERT INTO json_t (json_string) VALUES (?)");
$null = NULL;
$stmt->bind_param("b",$null);

$stmt->send_long_data(0, $json_to_save);

$stmt->execute();
$stmt->close();
$conn->close();

我试过了,但还是一样的错误

"执行准备好的语句时出错。行大小太大 (> 8126)。 将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,BLOB 前缀为 768 字节是内联存储的。”

请帮忙。

$stmt = $conn->prepare("INSERT INTO json_t (json_string) VALUES (?)");
$null = NULL;
$stmt->bind_param("b",$null);

$max_allowed_packet = 100000;
if (!$stmt->bind_param('b', $null))
die("Error binding parameters. {$stmt->error}\n");
echo "<br/><br/>";
foreach(str_split($v, $max_allowed_packet) as $packet )
if (!$stmt->send_long_data(0, $packet))
die("Error sending long packet. {$stmt->error}\n");
echo "<br/><br/>";
if (!$stmt->execute())
die("Error executing prepared statement. {$stmt->error}\n");

OK 问题解决了。我将引擎更改为 MyISAM。

【问题讨论】:

  • 执行准备好的语句时出错。行大小太大 (> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀被内联存储。

标签: php mysql


【解决方案1】:

允许将参数数据以片段(或块)的形式发送到服务器,例如如果 blob 的大小超过 max_allowed_pa​​cket 的大小。 可以多次调用此函数,以发送列的字符或二进制数据值的一部分,该列必须是 TEXT 或 BLOB 数据类型之一。

强调我的。

您需要自己分解字符串,例如使用str_split($json_to_save, 100000);,然后调用send_long_data 将每个片段作为块发送到 MySQL 服务器。

【讨论】:

    【解决方案2】:

    已经有很多关于这个的问题了。

    https://dba.stackexchange.com/questions/75328/row-size-error-with-mysql/75333#75333

    (我不能标记为重复)

    问题是你的服务器设置innodb_log_file_size

    如何找出一个好的设置: https://stackoverflow.com/a/18811422

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多