Please enable Javascript to view the contents

mysql: error code: 1118 行数据太大

 ·  ☕ 2 分钟

错误信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*Table structure for table `tb_goods_desc` */

DROP TABLE IF EXISTS `tb_goods_desc`;
CREATE TABLE `tb_goods_desc` (
  `goods_id`               bigint(20) NOT NULL
  COMMENT 'SPU_ID',
  `introduction`           varchar(3000) DEFAULT NULL
  COMMENT '描述',
  `specification_items`    varchar(3000) DEFAULT NULL
  COMMENT '规格结果集,所有规格,包含isSelected',
  `custom_attribute_items` varchar(3000) DEFAULT NULL
  COMMENT '自定义属性(参数结果)',
  `item_images`            varchar(3000) DEFAULT NULL,
  `package_list`           varchar(3000) DEFAULT NULL
  COMMENT '包装列表',
  `sale_service`           varchar(3000) DEFAULT NULL
  COMMENT '售后服务',
  PRIMARY KEY (`goods_id`)
)
  ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

/* SQL错误(1118):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 */

错误原因

Row size too large. :即行的总长度太大,超过了限制的 65535 字节。

MySQL 要求一整行数据总长度最多不能超过 65535 字节;即使存储引擎能够支持更大的行 也是如此。由于 BLOB 和 TEXT 类型(大字段类型)的列 只需在表中存储相关引用信息, 而实际数据存储在其它地方;所以它们最多在一行中占用 9 到 12 个字节。

对于上面的建表语句;我们简化一下,只看类型为 varchar(3000) 的所有 6 个列。它们 6 个列加起来的总长度的计算方式:

  • 6 个列的varchar值都是 3000,表示每个列最多可存储 3000 个字符
  • 每个字符大小需要根据字符集来计算:
    • 在 utf8mb3 字符集中,每个字符使用一到三个字节。(当前 utf8 是 utf8mb3 的别名,听说未来会将 utf8 作为 utf8mb4 的别名)
    • 在 utf8mb4 字符集中,每个字符使用一到四个字节。
    • 那么在计算行的最大长度时,肯定需要使用 每个字符集对应的一个字符最多占用的字 节数。在这里我们使用的是 utf8mb4 字符集,所以取值为 4 。
  • 最终结果为: 3000 x 6 x 4 = 72000‬ ,该值大于 65535 ,所以报错 : Row size too large

MySQL 最大行大小最终由多个因素决定;但总长度最多不能超过 65535 字节是硬性条件。 如果发现行大小的限制低于 65535 字节,则可能是其它因素产生了影响;具体可参考: MySQL:Limits on Table Column Count and Row Size

解决办法

  • 方法一:缩小 varchar 的值
  • 方法二:将 varchar 类型换成 TEXT 类型
  • 方法三: 将 utf8mb4 字符集 改成 utf8mb3 或其它字符集
  • 。。。
您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录