MySQL排查问题row size too large (> 8126). Changing some columns to TEXT or BLOB may help.

例子:给表增加一列报错:

alter table student add column `aggregate_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '聚合id'
1118: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

单行记录的合计最大大小超过了8126字节,那么根据文档描述的话,使用dynamic行格式的表行最大大小可以达到65536字节(因为mysql内部使用了2个字节来表示字段长度,因此可以表示最大65535的长度)

CREATE TABLE `student` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(700) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名字',
  `picture` varchar(127) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `description` varchar(1023) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `college_id` bigint(20) NOT NULL DEFAULT '0',
  `create_time` bigint(20) NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
  `data` json DEFAULT NULL COMMENT 'ext',
  `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4

计算:bigint 8 byte

80*8+700+127+1023+11*4=2534

虽然没有算上json字段的长度,感觉计算结果对不上。看了一些博客修改varchar为text并不能解决,需要修改mysql的配置文件,并且重启。但实际上,很多地方修改表的字段varchar啥的都会失败,跟alter语句的执行过程有关,有兴趣可以了解下,最有效的办法就是修改key_block_size的大小。

https://blog.51cto.com/hcymysql/4369124

https://www.jianshu.com/p/2c96a7f1b8aa

经过调研,“row_size>8126”报错应该是一个固定提示,所以可以不用纠结了!

https://mariadb.com/kb/en/innodb-strict-mode/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值