mysql - 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)
解决方案
您的问题是您的列存储多字节值,因此超出了最大行大小。
如文档中所述,无论您使用何种引擎,MySQL 表的最大行大小为 65,535 字节。添加你的两varchar(21844)
列意味着你超过了这个限制。发生这种情况是因为CHARSET
您表上的 是utf8
(当前是 的别名utf8mb3
),因此表中 a的每个字符varchar
最多占用 3 个字节(加上 2 个字节来存储长度)。一列 21,844 个字符就可以了,但两列就不行了。
要解决此问题,请使用TEXT
(或TINYTEXT
,MEDIUMTEXT
等) 而不是VARCHAR
列。这将导致值单独存储,因此您的每一列实际上只会为行大小贡献几个字节。(这也在文档中进行了解释。)
另外,仅供参考:拼写是column
,不是cloumn
。
推荐阅读
- ios - 在 SwiftUI 中拖动到另一个视图时删除视图
- excel - 基于另一个范围内该值的预设的单元格的背景颜色
- javascript - 密码正则表达式阻止方括号和空格?
- unit-testing - 在 IBM Cloud 中运行 .net 核心单元测试
- amazon-cloudformation - REST API openapi 规范 AWS API Gateway 与 serverless.com 框架的集成
- sql - 从Sql中的下一行中减去当前行的数据
- python - django核心管理中的未知命令
- javascript - 如何为负数获得正确的按位左移值?
- sql - 没有周末预言机功能的两个日期之间的差异
- java - 在不使用 RAM 的情况下从 Internet 下载文件并显示进度条