场景
在开发过程中,需要对原有的字段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就可以解决了。
对于自身来说 是一次成长,对于感兴趣的问题。建议在不影响工作的情况下进行深究,会有很大的帮助。
如果对你有帮助,记得点赞/评论/收藏~ 谢谢