我正在尝试处理一个数据库,该数据库有一个使用MySQL无法读取的longblobs表(5.6.36)。
如果max_allowed_packet为1024MiB,我无法选择长度为26840023(~25MiB)的列的内容。
mysql> select bid, length(batch) from batch where bid = 32;
+-----+---------------+
| bid | length(batch) |
+-----+---------------+
| 32 | 26840023 |
+-----+---------------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES WHERE variable_name = 'max_allowed_packet';
+--------------------+------------+
| Variable_name | Value |
+--------------------+------------+
| max_allowed_packet | 1073741824 |
+--------------------+------------+
1 row in set (0.00 sec)
mysql> select batch from batch where bid = 32 limit 1;
ERROR 2020 (HY000): Got packet bigger than 'max_allowed_packet' bytes
虽然这不是我的数据库,我不认为我会亲自在MySQL中存储这类数据,但我试图理解max_allowed_packet限制与实际检索该信息之间的关系。 / p>
我认为长度为〜25MiB的列需要近40倍的字节才能表达其内容。我误解了这里发生了什么吗?对于任何给定长度的blob数据是否有合适的max_allowed_packet,或者那里没有可靠的相关性?
我的假设一直是长度不是精确的字节数(某些字符可能需要更多的字节来表示),但每个字符长度(至少)40个字节对我来说是无法解释的。有没有办法确定给定blob值的适当max_allowed_packet是什么?
答案 0 :(得分:1)
数据包确实有(大约)25MB。这里的问题(很可能)是服务器和客户端都有自己的 max_allowed_packet 设置。 show variables
仅显示服务器设置。根据{{3}}
通过更改max_allowed_packet变量的值来更改消息缓冲区大小时,如果客户端程序允许,还应更改客户端的缓冲区大小。 [...] mysql和mysqldump的默认值分别为16MB和24MB。它们还允许您通过在命令行或选项文件中设置max_allowed_packet来更改客户端值。
有效的允许数据包大小(您可能无法查询)将由服务器或客户端的较低值确定,因此请在配置文件([mysql]
下)或命令行中设置值。
对于其他客户,您可能不需要调整它,因为
内置于客户端库的默认max_allowed_packet值为1GB。