【问题标题】:SQL Error (1118):Row size too large. The maximum row size for the used table type, not counting BLOBsSQL 错误 (1118):行大小太大。使用的表类型的最大行大小,不包括 BLOB
【发布时间】:2015-07-13 03:30:58
【问题描述】:

我已经创建了一个 MySQL 数据库表。我必须在一张表中创建 195 列。我必须给 190 列的数据类型是 VARCHAR,5 列的数据类型是文本。每列的长度为 500。

实际上我想在一个数据库表中创建 1000 列,并且我想在每个表列中使用数据类型是 VARCHAR。现在,当我在数据库表中创建新列时。我收到此错误:

SQL 错误 (1118):行大小太大。使用的表类型的最大行大小(不包括 BLOB)为 65535。这包括存储开销,请查看手册。您必须将某些列更改为 TEXT 或 BLOB

【问题讨论】:

  • !95 列的 VARCHAR(500) 看起来像糟糕的数据库设计。 See 获取最大列详细信息
  • 我第一次为 Web 应用程序创建大型数据库。我需要在一个具有相同数据类型 VARCHAR 和长度的数据库表中创建 1000 列。我可以在一个数据库表中创建 1000 列吗?我现在该怎么办?

标签: mysql


【解决方案1】:

你的数据库设计有缺陷。

MySQL 的最大行大小 = 65,535 字节。

假设每个字符 1 个字节 500 X 1000 = 每行 50,000 个字节,接近 65,535。

对于使用 latin1 的 VARCHAR(L),每列需要 1 个字节来保持长度 L,所以现在我们的长度为 501,000。

对于存储多字节字符的 VARCHAR 列,有效最大字符数较少。例如,utf8 字符每个字符最多需要三个字节。

500 X 4 X 1000 = 2,000,000 字节(每个字符 3 个 + 长度 1 个)

更多信息 MySQL 文档MySQL Maximum Number of Columns AND Data Type Storage Requirements

我建议您在继续之前了解有关数据库设计的更多信息。

【讨论】:

  • 谢谢大卫 strachan
  • 我不同意你的“你的数据库设计有缺陷”的前提——我认为 MySQL 的数据存储模型有缺陷。
【解决方案2】:

您需要将数据类型从VARCHAR 更改为TEXT,这将克服MySQL 中的行限制。

由于行限制,下面的查询会产生错误:

mysql> 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;

ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

但是当您将其更改为 TEXT 数据类型时,它可以工作。在下面的 MyISAM 示例中,将列更改为 TEXT 可避免 65,535-byte 行大小限制并允许操作成功,因为 BLOBTEXT 列仅对行大小贡献 9 到 12 个字节。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)

Further reading

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 2014-09-13
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2014-12-31
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多