如果我执行此查询:
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。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或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。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB
为什么?
运行mysql --version
返回
使用EditLine包装器的macOS10.12(x86_64)的mysql Ver 14.14 Distrib 5.7.17
答案 0 :(得分:0)
您的问题是您的列存储多字节值,因此超过了最大行大小。
如docs中所述,无论您使用什么引擎,MySQL表的最大行大小为65,535字节。添加两个varchar(21844)
列意味着您超出了此限制。发生这种情况是因为表上的CHARSET
是utf8
(当前是utf8mb3
的别名),所以是each character of a varchar
in your table takes a maximum of 3 bytes(加上2个字节来存储长度)。一栏21844个字符就可以了,但是两栏就不行了。
要解决此问题,请使用TEXT
(或TINYTEXT
,MEDIUMTEXT
等)而不是VARCHAR
列。这将导致值分别存储,因此您的每一列实际上只会对行大小贡献几个字节。 (docs中也对此进行了说明。)
此外,仅供参考:拼写为column
,而不是cloumn
。