如果我执行此查询:
CREATE TABLE `varchar_test1` (
`id` tinyint(1) NOT NULL,
`cloumn_1` varchar(21844) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;没事的。
如果我执行以下操作:
ALTER TABLE `varchar_test1` ADD COLUMN `cloumn_2` varchar(21844) NOT NULL;我收到一个错误:
错误1118 (42000):行大小太大。使用的表类型的最大行大小(不包括BLOB)为65535。这包括存储开销,检查手册。必须将某些列更改为文本或BLOB。
如果我执行这个:
CREATE TABLE `varchar_test2` (
`id` int NOT NULL AUTO_INCREMENT,
`cloumn_1` varchar(21844) NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;我得到:
错误1118 (42000):行大小太大。使用的表类型的最大行大小(不包括BLOB)为65535。这包括存储开销,检查手册。必须将某些列更改为文本或BLOB。
为什么?
运行mysql --version返回
mysql 14.14远端5.7.17,用于macos10.12 (x86_64),使用EditLine包装器
发布于 2018-12-12 07:27:05
您的问题是,您的列存储多字节值,因此超过了最大行大小。
正如在文档中解释的那样,MySQL表的最大行大小为65,535字节,而不管您使用的引擎是什么。添加两个varchar(21844)列意味着超出了这个限制。这是因为表上的CHARSET是utf8 (当前是utf8mb3的别名),所以是在表中,最多需要3个字节。 (加上存储长度的2个字节)。对于21,844个字符的一列来说,这是可以接受的,但对于两个字符则不是这样。
要解决这个问题,请使用TEXT (或TINYTEXT、MEDIUMTEXT等)而不是VARCHAR列。这将导致将值单独存储,因此您的每个列实际上只为行大小贡献了几个字节。(这在文档中也有解释。)
另外,FYI:拼写是column,而不是cloumn。
https://stackoverflow.com/questions/53737851
复制相似问题