You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)就能解决。
  • 检查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

火山引擎 最新活动