Mysql如何使用UTF8字符集将列添加为varchar(21884)



如果我执行此查询:

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)列意味着您超过了这个限制。发生这种情况是因为表中的CHARSETutf8(当前是utf8mb3的别名(,因此表中varchar的每个字符最多占用3个字节(加上2个字节来存储长度(。一列21844个字符就可以了,但两列就不行了。

要解决此问题,请使用TEXT(或TINYTEXTMEDIUMTEXT等(而不是VARCHAR列。这将导致值被单独存储,因此每个列实际上只会为行大小贡献几个字节。(文档中也对此进行了解释。(

另外,仅供参考:拼写是column,而不是cloumn

最新更新