mysql - MySQL 8.0 行长度(8,126 对 65,535)
问题描述
我正在尝试创建一个宽表,用于在清理之前导入数据。它有 221 列类型varchar(90)
,Innodb 使用 Latin1。
当我尝试创建它时,我收到一条错误消息Error Code: 1118. Row size too large (> 8126). Changing some columns to TEXT or BLOB may help.
但是在线帮助说最大值是 65,355。事实上,如果我尝试使用更简单的 create 语句作为测试(如下),我会收到不同的错误消息:Error Code: 1118. Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.
CREATE TABLE t (
a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000),
d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000),
g VARCHAR(6000)
) ENGINE=InnoDB CHARACTER SET latin1;
为什么我会收到不同的错误消息,似乎表明不同的最大行长度?
解决方案
MySQL 架构支持可插拔存储引擎。这意味着在 SQL 层和存储引擎层都有限制。
8126 的大小限制在 InnoDB 存储引擎中。如果您使用 InnoDB,这是行大小限制。65355的行大小限制是在SQL层,所以不管你用什么存储引擎除了InnoDB,它只支持最多65355字节的行(BLOB/TEXT除外)。
您可以将 InnoDB 表设置为 ROW_FORMAT=DYNAMIC。这改变了它存储 VARCHAR/BLOB/TEXT 的方式,您可以通过这种方式存储更多列。
但我强烈建议您重新考虑具有 200 多个 varchar 列的表设计,无论您使用什么存储引擎。这听起来真的像你没有为你的设计练习良好的规范化。
推荐阅读
- javascript - 数组和由该数组中的元素分配的变量之间的奇怪依赖关系
- sql - SQL:从其他表中获取上一条记录
- accessibility -
- reactjs - 如何在 Fullcalendar Timegrid 视图中显示非连续日期?
- javascript - 是否有压缩媒体类型(MIME、Content-Type)的标准
- r - R中的套索回归中的假人
- ios - 如何在 iOS 中处理 Tab 键按下?
- php - 如何从树枝/扩展中替换“本地化日期”过滤器
- powerbi - 找出列中的特定字母。一旦发现我需要在新列中输出单词 - PowerBI
- matlab - 激活 Matlab 错误:许可证检出失败。许可证管理器错误 -9