建表不成功,ROW_FORMAT=COMPACT存储分析
本帖最后由 nyp30 于 2022-9-23 14:45 编辑建表语句:
CREATE TABLE `t1` (
`f1` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
`f2` varchar(255) DEFAULT NULL,
`f3` varchar(255) DEFAULT NULL COMMENT '',
`f4` varchar(2000) CHARACTER SET utf8mb4DEFAULT NULL,
`f5` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL,
`f6` varchar(2000) DEFAULT NULL,
`f7` varchar(100) DEFAULT NULL,
`f8` varchar(100) DEFAULT NULL,
`f9` int DEFAULT NULL,
`f10` int DEFAULT NULL,
`f11` varchar(255) DEFAULT NULL,
`f12` varchar(255) DEFAULT NULL,
`f13` varchar(255) DEFAULT NULL COMMENT '',
`f14` varchar(255) DEFAULT NULL COMMENT '',
`f15` varchar(255) DEFAULT NULL,
`f16` varchar(255) DEFAULT NULL,
`f17` bit(1) NOT NULL DEFAULT b'0' COMMENT '',
`f18` bit(1) DEFAULT b'0',
PRIMARY KEY (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='';
故障:在MySQL8.0.26下可以执行成功,升级到8.0.29后执行失败。是否是BUG?有大神能分析这个格式下为啥有问题吗?把3个2000长度的字段如果合并为一个字段就算长度为8000也不报错,就少了两个字段,但我去掉两个100长度的字段也不行的。
可以看下8.0.29之后的一个新变化
InnoDB: When using COMPACT or REDUNDANT row format, it was possible to create a table that exceeded the maximum row size, which could eventually result in 'Row size too large' errors when inserting data. BLOB prefixes were not included in the record size check performed during the CREATE TABLE operation. (Bug #33399379)
详情见 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-29.html 或者把row format改成dynamic就行了 yejr 发表于 2022-9-23 14:54
或者把row format改成dynamic就行了
是的,主要是这样所有应用都需要核查修改,活大。还有一个可以设置innodb_strict_mode=OFF,这个最简单,就是还没有理清楚影响范围有多大,不敢动。 nyp30 发表于 2022-9-23 15:03
是的,主要是这样所有应用都需要核查修改,活大。还有一个可以设置innodb_strict_mode=OFF,这个最简单, ...
都上8.0版本了,row_format也跟着升级下吧 :)
页:
[1]