mysql:Row size too large (> 8126) ,ERROR 1118问题

文章讲述了在MySQL中遇到错误1118,因记录过长导致无法创建表结构的问题。原因在于字段过多且值长度大,超过InnoDB的一页限制。解决方法包括调整字段类型为TEXT或BLOB,以及关闭InnoDB严格模式。

目录

问题背景:

 原因分析:

解决办法


问题背景:

mysql数据库,执行sql脚本创建表结构时,报错

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

 原因分析:

创建的目标表有100个字段,其中又有很多 varchar(500)这样的字段值;

一条记录太长,超过了8126字节,建议部分列使用text或blob类型。字段太多了加起来超过了mysql  innodb_page_size的一半。

在MYSQL数据库中一条记录的最大长度是65535字节,即存储引擎支持一行存储更长的数据。

一条记录最大长度65535字节是MySQLO数据库Server层面的限制,

默认情况下,Innodb页面大小是16KB,所以

一条记录在页面中的存储长度不能超过8126字节,这是Innodb存储引擎的限制。

解决办法:

  1. 修改sql语句,改其中的表的字段 ,varchar字段的值根据需求,尽量设计的小,或者将大的varchar字段类型修改为 text类型或blob类型
  2. 关闭InnoDB严格模式

set global innodb_strict_mode  = 0;

MySQL 错误 `ERROR 1118 (42000): Row size too large (> 8KB)` 表示表中某一行的总大小超过了 InnoDB 存储引擎允许的最大行大小限制。InnoDB 的最大行大小通常受限于页大小,默认情况下使用 16KB 的页大小,但实际存储的一行数据不能超过约 8KB,这是因为页中还需要存储其他元数据和预留空间[^1]。 ### 解决方案 #### 1. **减少行大小** - 检查表结构,确认是否有过多的 `VARCHAR` 或 `TEXT` 类型字段。如果某些字段内容较大,可以考虑将其拆分为多个表,或使用外键关联。 - 将部分大字段(如 `TEXT`、`BLOB`)移动到单独的表中,并通过主键进行关联,以降低单行的数据量[^1]。 #### 2. **修改列类型为 `TEXT` 或 `BLOB`** - 对于较长的字符串字段,应避免使用 `VARCHAR(65535)` 等超长定义。InnoDB 在行内存储 `VARCHAR` 的长度有限,而 `TEXT` 和 `BLOB` 类型的内容会被外部溢出页(off-page storage)存储,从而减少主行的大小[^1]。 #### 3. **启用 `innodb_file_per_table=ON`** - 如果尚未启用独立表空间,建议设置 `innodb_file_per_table=ON`,这样每个表都有自己的表空间,有助于优化存储布局和管理溢出页。 #### 4. **调整 `ROW_FORMAT`** - 使用 `ROW_FORMAT=COMPRESSED` 或 `ROW_FORMAT=DYNAMIC` 可以改善行存储方式。例如,`DYNAMIC` 格式会将变长字段(如 `VARCHAR`、`TEXT`)尽可能地存放在溢出页中,从而减少主行大小。 ```sql ALTER TABLE your_table ROW_FORMAT=DYNAMIC; ``` - 同样,`COMPRESSED` 行格式可对数据进行压缩,减少行的实际占用空间[^1]。 #### 5. **增加页大小(需谨慎)** - 如果确实需要更大的行容量,可以尝试在初始化 MySQL 实例时配置更大的页大小(如 32KB 或 64KB)。但这属于底层配置更改,会影响整个实例,并且不适用于已有的数据库实例。 - 配置方法:在启动前修改 `my.cnf` 或 `my.ini` 文件中的 `innodb_page_size` 参数,例如: ```ini [mysqld] innodb_page_size=32K ``` #### 6. **检查字符集和排序规则** - 使用多字节字符集(如 `utf8mb4`)会导致每列占用更多字节。例如,`utf8mb4` 中一个字符最多占用 4 字节,因此 `VARCHAR(255)` 最多可能占用 1020 字节(255 × 4 + 2 字节长度信息)。确保字段长度合理,避免不必要的浪费。 --- ### 示例:调整行格式并拆分大字段 假设有一个包含大量文本字段的表: ```sql CREATE TABLE documents ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255), content1 TEXT, content2 TEXT, content3 TEXT, content4 TEXT ) ROW_FORMAT=COMPACT; ``` 可以将其优化为: ```sql ALTER TABLE documents ROW_FORMAT=DYNAMIC; -- 或者拆分内容字段到另一个表 CREATE TABLE document_contents ( doc_id INT PRIMARY KEY, content1 TEXT, content2 TEXT, content3 TEXT, content4 TEXT ) ROW_FORMAT=DYNAMIC; ``` --- ### 总结 解决 `Row size too large (> 8KB)` 错误的核心在于优化表结构设计,合理使用 `TEXT`/`BLOB` 类型,并选择合适的行格式。此外,避免在同一行中放置过多大字段是关键策略之一。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值