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

浙公网安备 33010602011771号