如果我执行此查询:
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或BLOBs
如果我执行这个:
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或BLOBs
为什么?
运行mysql --version
返回
mysql版本14.14 Distrib 5.7.17,适用于使用EditLine包装的macos10.12(x86_64(
您的问题是列存储多字节值,因此超过了最大行大小。
正如文档中所解释的,MySQL表的最大行大小为65535字节,而与您使用的引擎无关。添加两个varchar(21844)
列意味着您超过了这个限制。发生这种情况是因为表中的CHARSET
是utf8
(当前是utf8mb3
的别名(,因此表中varchar
的每个字符最多占用3个字节(加上2个字节来存储长度(。一列21844个字符就可以了,但两列就不行了。
要解决此问题,请使用TEXT
(或TINYTEXT
、MEDIUMTEXT
等(而不是VARCHAR
列。这将导致值被单独存储,因此每个列实际上只会为行大小贡献几个字节。(文档中也对此进行了解释。(
另外,仅供参考:拼写是column
,而不是cloumn
。