mysql 变更长度报错 1118 Row size too large.

场景

在开发过程中,需要对原有的字段varchar 扩大长度。

执行更新语句sql

ALTER TABLE `xxx` MODIFY `字段名` varchar(64);

报错

ALTER TABLE xxx MODIFY 字段名 varchar(64)

1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

时间: 0.001s

思考

这种问题从来没有遇见过,有些奇怪,有些让人“兴奋”;但是这种问题是如何产生的呢?

  • 在平时像这种变更长度的也没有遇见过这种错误额。难道说是mysql升级了之后需要注意使用姿势;
  • mysql数据库底层对varchar数据长度有限制;
  • 难道是因为表中的数据量太大了?导致触发了什么判断条件?(此问题不会,表数据太多会导致慢查询。不会出现上述错误)
  • 就是简单的字段数据超长;

验证

在查询相关资料之后,并没有找到什么有关mysql升级所带来的与此相关的问题

在查询有varchar的过程中,找到了有关于说varchar 的长度最多为21845长度。(65535 / 3 = 21845)

尝试将报错的内容进行 ”汉化“,一下为百度翻译内容

1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
-------------------------------------------------------------------------------------------------
1118-行大小 太大。所用表类型(不包括blob)的最大行大小为65535。这包括存储开销,请查看手册。您必须将某些列更改为文本或blob 

反复品味此内容,间接说明了 某一行的字段长度是有限制的;

动手试试

  • eg1
create TABLE `abc` (aaa VARCHAR(21846))
---- 报错内容如下
> 1074 - Column length too big for column 'aaa' (max = 21845); use BLOB or TEXT instead
> 时间: 0.002s
  • eg2
create TABLE `abc` (aaa VARCHAR(21845))
----- 报错内容如下
1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
  • eg3
create TABLE `abc` (aaa VARCHAR(21844))
---- 成功创建
> OK
> 时间: 0.072s

从上面的现象来看,可以得出varchar的最大长度为21844.不能大于等于 21845;


进一步尝试,增加其他常见类型字段 int bigint,此时尝试扩展varchar的 长度。是否也是符合上述条件中的信息

这里就不具体举例了,实验过程就是。新建一张包含int/bigint的字段,其中varchar的长度多预留一些否则创建不成功。表创建成功后,扩大varchar的长度进行试验。

结论是:其他字段的类型会‘占用更多的长度’,但是总的字节不会超过65535.当然这不包含字段为 test/blob 的情况

总结

在排查这个问题的过程中,有兴奋 有疑惑。

报错信息已经说明了,最大长度不可超过65535就已经说明长度超长了。至于是为什么超长,无非就是把超长字段变为text/blob就可以解决了。

对于自身来说 是一次成长,对于感兴趣的问题。建议在不影响工作的情况下进行深究,会有很大的帮助。

如果对你有帮助,记得点赞/评论/收藏~ 谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值