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

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/