mysql row size上限
2019-08-16 17:23
1401 查看
mysql innodb 的 row size上限
背景
在项目使用中,出现了以下报错:
Error Code: 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.
上面报错,这就涉及到了row size的上限,也有可能会涉及到file format的设置。
一些上限
- 创建表报错:maximum row size > 65535
- 创建表报错:row size too large > 8126
- 插入数据报错:row size too larget > 8126
这里主要讲第三种报错,插入数据的时候触发的报错。先要理清file format和row format两个概念。
个人理解修改这两个参数都有可能解决掉问题。为啥是有可能,因为file format只是部分长字段类型的设置。
File format
先解释下file forma。这是用于varchat或者text字段存储数据的方案。file format有两种,分别是Antelope和Barracuda。
Antelope模式
在MySQL 5.6之前的版本,默认file format是Antelope。
意思是,对于varchar和text字段,会将内容的前768字段放置在index record中,后面再接20个字节的指针。
剩下内容会放置在BLOB page中。
假设有11个text字段,每个字段都是1000字节。那么在插入数据的时候,row size = (768+20)* 11 = 8668 > 8126,将会触发
row size too larget > 8126报错。
如果使用Antelope模式,不建议使用超过10个text或varchar字段。
Barracuda模式
Barracude会将所有数据放在BLOB page中,在index record里面只放20个字节的指针。
设置切换
查询File format设置:
show variables like "%innodb_file%";
my.cnf 设置
innodb_file_format = Barracuda # innodb_file_per_table = 1 innodb_large_prefix = 1
Row format
innodb引擎的行格式(row format)有两种。分别是compact和dynamic/compressed。
ALTER TABLE test ROW_FORMAT=COMPRESSED; SHOW TABLE STATUS IN test_db;
这里还是之说Antelope模式下使用text的问题。普通的数值类型,其实很难超8126的长度限制,就不说了。在Antelope模式下,text字段的前768会存储在index record中,会占用row size的768+2个字节。所以text/varchar字段不能太多。除非确定不会太长。
# 验证测试的sql create table text2 ( text1 longtext, text2 longtext, text3 longtext, text4 longtext, text5 longtext, text6 longtext, text7 longtext, text8 longtext, text9 longtext, text10 longtext, text11 longtext ) ENGINE=InnoDB DEFAULT CHARSET=ascii; insert into text2 values( repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000) ); insert into text2 values( repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',197) # repeat('y',198) error ); -------- create table text3 ( text1 longtext, text2 longtext, text3 longtext, text4 longtext, text5 longtext, text6 longtext, text7 longtext, text8 longtext, text9 longtext, text10 longtext, text11 longtext ) ENGINE=INNODB DEFAULT CHARSET=ascii ROW_FORMAT=COMPRESSED; insert into text3 values( repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000), repeat('y',1000) );
相关文章推荐
- MySQL Row size too large (> 8126) 以及ROW_FORMAT=COMPRESSED requires innodb_file_format > Antel 的解决办法
- Mysql 导入psc 文件时,数据列过多,提示Row size too large(>8126)
- MySql 5.6异常处理: Row size too large (> 8126)
- [MySQL 错误]ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not
- mysql 1118 Row size too large 错误
- mysql 主从同步故障解决 Error 'Row size too large (> 8126).
- MySQLSyntaxErrorException: Row size too large 转摘自:https://confluence.atlassian.com/display/CONFKB/MySQLSyntaxErrorException%3A+Row+size+too+large
- mysql存储大数据时,Row size too large
- Mysql [Err] 1118 - Row size too large
- MySql “Row size too large (> 8126)”
- Mysql [Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.
- MySQL出现The maximum row size for the used table type, not counting BLOBs, is 8126.错误
- Mysql 报Row size too large 65535 的原因及解决方法
- mysql 报错:Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65
- Mysql MySQLSyntaxErrorException Row size too large
- MySQL报错 Mysql Row Size too large (>8126) 和 Unknow Table Engine InnoDB 解决方案
- MySQL Database Error: Row size too large.
- [MySQL 错误]ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not
- Mysql_大字段问题Row size too large.....not counting BLOBs, is 8126.
- MySql “Row size too large (> 8126)” 亲测解决