Mysql 建表导入数据库文件时,报错 ROW size too large (> 8126) changing some columns to TEXT or BLOB OR using row_f
COMPACT格式在尝试将数据存储在行内时更容易超出 8KB 的限制。DYNAMIC格式则通过将大字段存储在页外,避免了这一问题,从而不容易触发错误。COMPRESSED格式会压缩数据,适合节省磁盘空间,但可能会增加 CPU 负担,且对存储方式与DYNAMIC类似。解决办法: 直接将ROW_FORMAT = COMPACT改成ROW_FORMAT = DYNAMIC;
建表语句 下面为部分建表语句伪代码,如下:
CREATE TABLE `gf_kds` (
...
) ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = COMPACT;
在有的时候,我们导入SQL 到数据库,可能存在一个报错信息进而导致导入失败,
sql 报错 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
ROW_FORMAT
类型的区别:
-
ROW_FORMAT=COMPACT
(默认)COMPACT
是 InnoDB 的默认行格式。- 在这种格式下,所有列(包括
VARCHAR
和其他类型的数据)会直接存储在行内(如果行内的存储空间不足,InnoDB 会将数据存储到外部)。 - 对于包含大字段的表,
COMPACT
行格式会尝试将所有数据包含在行内,这会导致行大小超过最大限制(8KB),从而触发错误。
-
ROW_FORMAT=DYNAMIC
DYNAMIC
格式将大字段(例如TEXT
,BLOB
)存储在页外(off-page)。- 对于较长的
VARCHAR
列或大字段类型,DYNAMIC
格式可以把这些列的实际数据存储在页外,只在行内保存一个指针,减少行内数据的大小。 - 这种方式可以避免超过行大小限制(8KB),因此对于包含很多大字段的表非常适用。
-
ROW_FORMAT=COMPRESSED
COMPRESSED
格式将表的数据进行压缩存储,以节省磁盘空间。- 它也支持将大字段(如
TEXT
和BLOB
)存储在外部,但会增加 CPU 开销,因为压缩和解压缩需要额外的计算资源。 - 它对空间的优化有帮助,适合存储大量数据,但可能会影响性能,特别是在高频读写的情况下。
为什么 ROW_FORMAT=COMPACT
报错,而 ROW_FORMAT=DYNAMIC
不报错?
ROW_FORMAT=COMPACT
默认将所有数据存储在行内,如果表中包含很多列或者 VARCHAR
列的长度较大,InnoDB 尝试将它们存储在一行内时可能会导致总行大小超过 8KB。这时就会触发错误:
sql 报错 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
而 ROW_FORMAT=DYNAMIC
会将大字段(如 TEXT
或长度较长的 VARCHAR
列)存储在页外(off-page),在行内只存储指向这些大字段的指针。这样,行内的实际数据更少,不容易超出 8KB 的限制,因此不会触发这个错误。
总结:
COMPACT
格式在尝试将数据存储在行内时更容易超出 8KB 的限制。DYNAMIC
格式则通过将大字段存储在页外,避免了这一问题,从而不容易触发错误。COMPRESSED
格式会压缩数据,适合节省磁盘空间,但可能会增加 CPU 负担,且对存储方式与DYNAMIC
类似。
解决办法: 直接将 ROW_FORMAT = COMPACT 改成 ROW_FORMAT = DYNAMIC;

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)