Mysql存储过程 1406 - Data too long for column 'pids' at row 1

  mysql数据库里遇到 1406 - Data too long for column ‘pids’ at row 1,为了这个报错搞得我欲哭无泪、百感交集、心力憔悴。
  好吧,不滥用成语了。这里记载了我找的一些解决方法,以及我的存储过程报错的根本原因,可以直接查看“寻找解决方法”、“我的问题的根源


问题描述:
  在mysql数据库中写存储过程,用循环将每条记录的层级父ID使用concat函数以及“1,2,3,4”形式拼接起来,形成层级目录结构,并更新到表的另一个列pids(Parent Ids)中。
  运行过程中有的记录可以正常更新,但有些记录报“1406 - Data too long for column ‘pids’ at row 1”的错误,然后存储过程程序就停止了。(T_T)

寻找解决方法:
  看了网上许多博客、贴吧的方案:

  • 扩大字段的长度。==>从500到2000到5000,还是报错。
  • 修改表以及字段的编码。==>改了,没起作用,还是报错。
  • 修改MySQL安装目录下的my.ini文件。==>我用的是免安装版,没有这个文件。

参考的博客,点击访问:
mysql更改表与字段的编码方式 - 诺坎普奇迹
mysql data too long for column xxx解决方案 - 秤秤biubiu
成功解决data too long for column ‘name’ at row 1 - zhaopeipei1985
Mysql字符集之utf8和utf8mb4的使用问题 - 张小凡

我的问题的根源:
  断断续续着找了两天,第三天发现问题的根本原因了。是存储过程的插入的值太长了!
  那么为什么加大字段长度还是报错呢?因为死循环!它在不断拼接值,直到超过字段长度然后抛错!
  那为什么会有死循环呢?大部分记录却又不会有死循环呢?因为有某两条记录互相为对方的父ID!你是我的父ID,拼接;我是你的父ID,继续拼接。(这里我有一句MMP一定要说,谁tm产生的这么狗血的数据!)
  所以总结一下,就是因为原始数据不正常导致存储过程陷入死循环并不断拼接字符串,最终导致值的长度过长的报错

回顾:
  在看别人博客并尝试解决问题的过程中发现,提到的解决方法在我的实际情况中都是正确的配置,但就是仍然报错。也了解到了mySQL的utf8(3字节)不是真正的通用utf8(4字节),mySQL的utf8mb4才是4字节的。
  关于发现真正问题有几点:平时数据库操作基本上都是基本的增删改查,存储过程刚接触不久还不熟练,把程序最基本的死循环问题给忘了,也有一点是没想到原始数据居然有这种错误。但也在思考为什么会有不正常的原始数据(以及再次想说mmp),怎么产生的这种数据,以方便排查。
  谨记认真仔细,以及程序抛出的错误也可能只是表面错误,不一定是报错的根源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值