例子:给表增加一列报错:
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”报错应该是一个固定提示,所以可以不用纠结了!