Mysql:导入数据异常 ROW size too large (> 8126) changing some columns to TEXT or BLOB
导入数据异常 ROW size too large (> 8126) changing some columns to TEXT or BLOB
·
MySQL 表的行格式(ROW_FORMAT)用于控制数据在磁盘上的存储方式,不同格式会影响存储空间、性能及兼容性。常见的行格式包括:
1. ROW_FORMAT=DEFAULT
- 说明:默认行格式,取决于表使用的存储引擎。
- InnoDB 5.7 及之前默认是
COMPACT,8.0 后默认是DYNAMIC。 - MyISAM 默认是
REDUNDANT(旧格式,兼容性强但空间效率低)。
- InnoDB 5.7 及之前默认是
2. ROW_FORMAT=COMPACT
- 存储特点:
- 紧凑格式,数据行头部使用二进制表示字段长度,占用空间较少。
- 对于变长字段(如
VARCHAR),字段长度信息存储在行头部,若字段长度超过 255 字节,用 2 字节存储长度;否则用 1 字节。
- 适用场景:需要节省存储空间且无大字段(如超长字符串)的场景。
3. ROW_FORMAT=DYNAMIC
- 存储特点:
- 与
COMPACT类似,但针对大字段(如TEXT/BLOB)优化:- 大字段的前 768 字节数据存储在数据页中,超过部分存储在溢出页(off-page),数据页仅保留溢出页指针。
- 字段长度信息始终存储在数据页,不随字段长度变化而占用更多字节。
- 与
- 优势:减少大字段对数据页的占用,提升数据页利用率和查询性能。
4. ROW_FORMAT=REDUNDANT
- 说明:旧版行格式,字段长度信息使用非二进制方式存储,兼容性强但空间效率低,仅用于兼容旧版本 MySQL。
5. ROW_FORMAT=COMPRESSED
- 说明:压缩格式,使用
zlib压缩数据行,适用于 read-only 表或历史数据归档,节省存储空间但增加 CPU 开销。
为什么 ROW_FORMAT=COMPACT 报错,而 DYNAMIC 不报错?
常见报错场景
当表中存在 大字段(如 VARCHAR(65535)、TEXT 等)或 多变长字段 时,可能出现以下问题:
1. COMPACT 格式报错原因
- 行数据长度限制:
- InnoDB 数据页默认大小为 16KB,
COMPACT格式下,行数据(包括头部、字段数据、NULL 值标识等)需全部存储在数据页中。 - 若行数据总长度超过数据页剩余空间(约 16KB - 页头开销),会触发
Row size too large错误(如Error 1118: Row size too large)。
- InnoDB 数据页默认大小为 16KB,
- 变长字段长度存储限制:
COMPACT格式中,变长字段长度需占用 1 或 2 字节,若表中有多个长字段,长度信息累计可能导致行数据超出限制。
2. DYNAMIC 格式不报错原因
- 大字段溢出机制:
DYNAMIC格式将大字段(如TEXT/BLOB或超长VARCHAR)的大部分数据存储在溢出页,数据页仅存储前 768 字节和指针,大幅减少数据页内的行长度。- 即使字段总长度很大,数据页内的行数据仍可控制在 16KB 以内,避免触发行长度限制错误。
- 字段长度存储优化:
- 字段长度信息固定存储在数据页,不随字段实际长度增加而占用更多空间,进一步降低行数据膨胀风险。
总结
| 行格式 | 大字段存储方式 | 行长度限制风险 | 适用场景 |
|---|---|---|---|
COMPACT |
全部存储在数据页 | 高(易因行过长报错) | 小字段、非大表场景 |
DYNAMIC |
大字段数据溢出到外部页 | 低(数据页内长度可控) | 含大字段或高并发查询的场景 |
建议:
- 新建表时优先使用
DYNAMIC(InnoDB 默认),尤其当表包含大字段或预期数据量较大时。 - 若遇到
COMPACT格式的行长度报错,可通过以下方式解决:- 改用
ROW_FORMAT=DYNAMIC。 - 拆分大字段到单独表(垂直分表)。
- 增大数据页大小(需谨慎,修改
innodb_page_size需重启数据库且不可逆)
- 改用
解决办法: 直接将 ROW_FORMAT = COMPACT 改成 ROW_FORMAT = DYNAMIC;
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)