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

解决方案


MySQL 架构支持可插拔存储引擎。这意味着在 SQL 层和存储引擎层都有限制。

8126 的大小限制在 InnoDB 存储引擎中。如果您使用 InnoDB,这是行大小限制。65355的行大小限制是在SQL层,所以不管你用什么存储引擎除了InnoDB,它只支持最多65355字节的行(BLOB/TEXT除外)。

您可以将 InnoDB 表设置为 ROW_FORMAT=DYNAMIC。这改变了它存储 VARCHAR/BLOB/TEXT 的方式,您可以通过这种方式存储更多列。

但我强烈建议您重新考虑具有 200 多个 varchar 列的表设计,无论您使用什么存储引擎。这听起来真的像你没有为你的设计练习良好的规范化。


推荐阅读