[ERR] 1118 - Row size too large (> 8126)

一、MySQL 8 导入大表时的错误

在 MySQL 8 中,用导入脚本创建数据库时,有一张大表出现如下错误:

 

[ERR] 1118 - 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.

 

 

 

 二、原因分析

核心原因是:表中所有字段的 “行内存储总长度” 超过了 InnoDB 引擎的单行大小限制(默认 8126 字节)。

InnoDB 对 “行内存储的总字节数” 有严格限制(默认 8126 字节),这里的 “行内存储” 指:

  • 所有非 TEXT/BLOB 类型的字段(如 varchar、int、datetime 等)会直接存储在行内。
  • TEXT/BLOB 类型(包括 longtext)虽然允许存储大内容,但默认会在行内存储 768 字节  的前缀(剩余内容存在行外)(注:在 ROW_FORMAT=COMPACT 时)。

 

 

在 InnoDB 存储引擎中,ROW_FORMAT 用于指定表的行存储格式,影响数据在磁盘上的存储方式(尤其是大字段如 TEXT/BLOB 的处理)

  • COMPACT(紧凑格式):对 TEXT/BLOB 字段,强制在行内存储前 768 字节前缀,剩余内容存储在行外(溢出页),行内保留指向行外数据的指针。
  • DYNAMIC(动态格式):对 TEXT/BLOB 字段:仅当行内空间足够时才存储前缀,若行内空间不足,会将整个字段内容移至行外,行内仅保留 20 字节的指针(指向行外数据)。

 

 三、解决方法

优化表结构:将部分大长度的 VARCHAR 字段改为 TEXT
修改表的行格式:将表的行格式改为 DYNAMIC

CREATE TABLE 表名 (
  ... 原表结构 ...
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; 

若已创建表,可通过ALTER TABLE修改:

ALTER TABLE 表名 ROW_FORMAT=DYNAMIC;

 

 

 

 

 

 

posted @ 2025-09-28 23:44  轻舟软件  阅读(341)  评论(0)    收藏  举报