ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT o

1,471 阅读1分钟

在创建数据库表时报错

之前已经在数据库里创建了多张表,但在创建其中一张数据库表时报如下错:

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
Query OK, 0 rows affected (0.00 sec)

原因分析

这篇文章说得比较清楚: 链接

简单来说,就是在InnoDB引擎下创建表时行格式无法存储它,可能有以下原因:

  1. strict mode 模式启用后,DDL 语句被执行时影响了表,如 CREATE TABLE or ALTER TABLE 操作,这时会抛出Error信息。
  2. strict mode 模式被禁用后,DDL 语句被执行时影响了表,如 CREATE TABLE or ALTER TABLE 操作,这时会抛出Warning信息。
  3. 不管strict mode 模式是否启用,DML语句被被执行写入一行时,InnoDB引擎行无法存储它时,会抛出这个Error信息。

我发现是第三种情况,因为网上很多人说是要设置下 strict mode 模式进行解决,我发现解决不了。

根本原因

在InnoDB引擎下,存在最大的row size的限制,它的限制大约是 innodb_page_size 这个系统变量的一半。详情

但不同的row format其具体值也会不一样,其中 DYNAMICCOMPRESSED row size是最大的。在做row format时,有以下几种模式:

  • REDUNDANT (MySQL 4.1 之前默认采用的方式)
  • COMPACT (MariaDB [10.1~10.2.1] 和 MySQL 5.6 之前默认采用的方式)
  • DYNAMIC (MariaDB >= 10.2.2 默认采用的方式)
  • COMPRESSED

四种不同的格式详情可参考: mariadb.com/kb/en/innod…

解决方法

将表的row format改成 DYNAMIC 或者 COMPRESSED 可解决 在这里插入图片描述