首页 > 解决方案 > 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 或 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回报

mysql Ver 14.14 Distrib 5.7.17,适用于使用 EditLine 包装器的 macos10.12 (x86_64)

标签: mysqlsql

解决方案


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

文档中所述,无论您使用何种引擎,MySQL 表的最大行大小为 65,535 字节。添加你的两varchar(21844)列意味着你超过了这个限制。发生这种情况是因为CHARSET您表上的 是utf8(当前是 的别名utf8mb3),因此表中 a的每个字符varchar最多占用 3 个字节(加上 2 个字节来存储长度)。一列 21,844 个字符就可以了,但两列就不行了。

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

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


推荐阅读