MediumBLOB存XML账单文档报Data too long错误,调参后仍失败求排查
解决MediumBLOB存入数据时“Data too long”的问题
首先,咱们先拆解下核心问题:MediumBLOB的最大存储容量是16,777,215字节(约16MB),而你设置的max_allowed_packet是16,777,216字节(刚好16MB),这两者差了1字节,再加上MySQL数据包本身的协议头开销,很容易触发这个报错。另外还有几个容易踩的坑,咱们逐一排查:
先确认你的数据实际大小
先去查看要存入的XML/账单文件的精确字节数(注意是字节数,不是MB的近似值):- Linux/macOS:用
du -b your_bill.xml命令查看 - Windows:右键文件→属性→查看“大小”(不是“占用空间”)
如果这个数值超过了16,777,215,那MediumBLOB肯定装不下,直接换成LONGBLOB类型(最大支持4GB)就能解决。
- Linux/macOS:用
检查
max_allowed_packet是否真的生效
你修改了my.ini,但有没有重启MySQL服务?配置文件修改后必须重启才能全局生效。另外,还要确认当前会话的参数是否正确:
登录MySQL后执行:SHOW VARIABLES LIKE 'max_allowed_packet';如果返回的值不是16777216(或更大),说明会话级参数没跟上。可以临时设置全局参数:
SET GLOBAL max_allowed_packet = 33554432; -- 设置为32MB退出重新连接后,再检查参数是否生效。
别纠结InnoDB日志大小了
你调整InnoDB日志的操作其实和这个报错无关——这个错误是因为数据超过列的容量限制,或者数据包大小超过允许值,和事务日志完全没关系,不用再浪费时间在这上面。额外注意:编码带来的字节膨胀
如果你的XML文件用的是UTF-8编码,部分特殊字符会占用多字节(比如emoji占4字节),如果文件字符数不多但字节数超了,也要考虑这个因素,但这个情况比较少见,优先排查前面两点。
总结下来,最可能的原因要么是数据真的超过了MediumBLOB的16MB上限,要么是max_allowed_packet没真正生效。先查数据大小,再确认参数,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Glas




