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

时间:2018-12-12 07:17:27

标签: mysql sql

如果我执行此查询:

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

1 个答案:

答案 0 :(得分:0)

您的问题是您的列存储多字节值,因此超过了最大行大小。

docs中所述,无论您使用什么引擎,MySQL表的最大行大小为65,535字节。添加两个varchar(21844)列意味着您超出了此限制。发生这种情况是因为表上的CHARSETutf8(当前是utf8mb3的别名),所以是each character of a varchar in your table takes a maximum of 3 bytes(加上2个字节来存储长度)。一栏21844个字符就可以了,但是两栏就不行了。

要解决此问题,请使用TEXT(或TINYTEXTMEDIUMTEXT等)而不是VARCHAR列。这将导致值分别存储,因此您的每一列实际上只会对行大小贡献几个字节。 (docs中也对此进行了说明。)

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