建表语句   下面为部分建表语句伪代码,如下:

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 类型的区别:

  1. ROW_FORMAT=COMPACT(默认)

    • COMPACT 是 InnoDB 的默认行格式。
    • 在这种格式下,所有列(包括 VARCHAR 和其他类型的数据)会直接存储在行内(如果行内的存储空间不足,InnoDB 会将数据存储到外部)。
    • 对于包含大字段的表,COMPACT 行格式会尝试将所有数据包含在行内,这会导致行大小超过最大限制(8KB),从而触发错误。
  2. ROW_FORMAT=DYNAMIC

    • DYNAMIC 格式将大字段(例如 TEXT, BLOB)存储在页外(off-page)。
    • 对于较长的 VARCHAR 列或大字段类型,DYNAMIC 格式可以把这些列的实际数据存储在页外,只在行内保存一个指针,减少行内数据的大小。
    • 这种方式可以避免超过行大小限制(8KB),因此对于包含很多大字段的表非常适用。
  3. ROW_FORMAT=COMPRESSED

    • COMPRESSED 格式将表的数据进行压缩存储,以节省磁盘空间。
    • 它也支持将大字段(如 TEXTBLOB)存储在外部,但会增加 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;

 

Logo

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

更多推荐