ERROR1118的报错信息分为两种:

1、ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

一行最大记录长度是65535(定义到这个长度也会报错,行本身维护也会占用字节),建议使用text或blobs类型。

2、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.

一条记录太长,超过了8126字节,建议部分列使用text或blob类型。

看到这两个报错信息,感觉描述的有些冲突,一个说一条记录最大长度 不超过65535字节,一个说长度不能超 过8126字节。

先看下官方文档的描述:

【The MySQL maximum row size limit of 65,535 bytes is demonstrated in the following InnoDB and MyISAM examples. The limit is enforced regardless of storage engine, even though the storage engine may be capable of supporting larger rows.】

在MYSQL数据库中一条记录的最大长度是65535字节,以下以Innodb和mysiam存储引擎为例,做了相关演示,不管任何存储引擎,都不能超过这个范围,即存储引擎支持一行存储更长的数据。

【InnoDB restricts row size (for data stored locally within the database page) to slightly less than half a database page for 4KB, 8KB, 16KB, and 32KB innodb_page_size settings, and to slightly less than 16KB for 64KB pages.】

Inodb存储引擎,对于4K,8K,16K和32K的页面大小,限制一条记录最多使用半个页面,,64K页面比16KB页面限制稍小一些。

小结:

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

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

一条记录在页面中的存储长度不能超过8126字节,

一条记录在页面中的存储长度不能超过8126字节,

一条记录在页面中的存储长度不能超过8126字节,(重要的事情说三遍)

这是Innodb存储引擎的限制。

这里可能会有些疑问,平常创建varchar(10000)类型字段,已经超过8126了,但也没报这个错误,这个和Innodb的存储一条记录的格式有关系,

官方文档对存储格式的说明:

【Fixed-length columns greater than or equal to 768 bytes are encoded as variable-length columns, which can be stored off-page】

当列的长度超过768字节时,多余的内容会存储到一个溢出页上,compact/dynamic格式在这方面是一样的。

也就是说创建了varhcar(10000)类型字段,同时写入到10000字节的数据,其实只有768个字节存储在数据页面上,其余的字节存储在溢出页面上。

为什么Innodb存储引擎,每个存储页面上,最少要有两条记录,

截图来自于【MySQL运维内参】

这是假如每个页面只能存储一条记录的情况下,表内存储了【1,2,3,4】4条记录B+树结构图,

如果一个页面的数据量不能存储2条记录,则这个B+树就不能称为B+树,因为它起不到一个索引的作用,其实就是一个双向链表,但比双向链表占用的空间大很多。

如果不能够存储2条记录,那么这个B+树是没有意义的,形不成一个有效的索引。

总结:

创建表和写入数据时有两个限制,一个是Server层面的限制,一条记录最大长度不能超过65535(真实创建的记录长度到不了65535,因为记录本身也需要一些字节去维护)

另一个是Innodb层面的限制,一条记录存储在页在中的长度不能够超过8126字节。

实验:

1、创建一个表t,记录长度之合超过65535.默认字符集是latin1,一个字符占一个字节,如果用的utf8,则一个字符占用3个字节。要在定义的varchar字段类型上乘以3才是占用字节数。

看t2表,varchar类型是5000,记录最长是35000字节,没有达到server层面的限制,

每个字段的768字节存储在innodb页面上,其余的数据存储在溢出页面上。

t2表一共7个字段,每个字段只有前边的768字节存储在Innodb页面上,7*768=5376字节,没有达到Inodb存储引擎8126的限制,不会报错,所以创建成功。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),-> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),-> f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;

ERROR1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

mysql> create table t1(a varchar(10000),b varchar(10000),c varchar(2000)) character set utf8;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

mysql> CREATE TABLE t2 (a VARCHAR(5000), b VARCHAR(5000),

-> c VARCHAR(5000), d VARCHAR(5000), e VARCHAR(5000),

-> f VARCHAR(5000), g VARCHAR(5000)) ENGINE=InnoDB CHARACTER SET latin1;

Query OK, 0 rows affected (0.01 sec)

2、创建t4表,使用char(255)定长字符串类型,char类型无论写入的内容多少(当然,一定要小于等于255),在实际存储时都会占用255个字节。

一共33字段,每个字段定长255字节,33*255=8415,每个记录最大长度是8145字节,是Server层的限制之内,所以没报65535的错误,

但一条记录在Innodb页面存储时超过了8126限制,所以Innodb存储引擎报错了。

mysql>CREATE TABLE t4 (-> c1 CHAR(255),c2 CHAR(255),c3 CHAR(255),-> c4 CHAR(255),c5 CHAR(255),c6 CHAR(255),-> c7 CHAR(255),c8 CHAR(255),c9 CHAR(255),-> c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),-> c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),-> c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),-> c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),-> c22 CHAR(255),c23 CHAR(255),c24 CHAR(255),-> c25 CHAR(255),c26 CHAR(255),c27 CHAR(255),-> c28 CHAR(255),c29 CHAR(255),c30 CHAR(255),-> c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)-> ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET latin1;

ERROR1118 (42000): 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.

3、修改t4表为varhcar(255),可变长字段试下,varchar字段类型在实际存储到页面的时候,并不以定长存储,而是写入多少字节,存储多少字节。

可以看到,这样创建表是没有问题,如果写入字节数小于8126字节也没有问题,

但是如果写入字节数超过8126了,由于Innodb存储引擎的限制,还是会报错的。

mysql>CREATE TABLE t4 (-> c1 VARCHAR(255),c2 VARCHAR(255),c3 VARCHAR(255),-> c4 VARCHAR(255),c5 VARCHAR(255),c6 VARCHAR(255),-> c7 VARCHAR(255),c8 VARCHAR(255),c9 VARCHAR(255),-> c10 VARCHAR(255),c11 VARCHAR(255),c12 VARCHAR(255),-> c13 VARCHAR(255),c14 VARCHAR(255),c15 VARCHAR(255),-> c16 VARCHAR(255),c17 VARCHAR(255),c18 VARCHAR(255),-> c19 VARCHAR(255),c20 VARCHAR(255),c21 VARCHAR(255),-> c22 VARCHAR(255),c23 VARCHAR(255),c24 VARCHAR(255),-> c25 VARCHAR(255),c26 VARCHAR(255),c27 VARCHAR(255),-> c28 VARCHAR(255),c29 VARCHAR(255),c30 VARCHAR(255),-> c31 VARCHAR(255),c32 VARCHAR(255),c33 VARCHAR(255)-> ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET latin1;

Query OK,0 rows affected (0.01 sec)

测试1:写入数据长度小于8126的场景,240*33=7920,可以成功。

insert into t4 (c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,c24,c25,c26,c27,c28,c29,c30,c31,c32,c33)

values(repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),

repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240),repeat(‘a‘,240))

Query OK, 1 row affected (0.01 sec)

mysql>

场景2:写入数据长度大于8126的场景,255*33=8415,直接报错。

mysql>insert into t4 (c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,c24,c25,c26,c27,c28,c29,c30,c31,c32,c33)-> values(repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),-> repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255),repeat(‘a‘,255));

ERROR1118 (42000): 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 isstored inline.

mysql>

原文:https://www.cnblogs.com/nanxiang/p/13056093.html

mysql err 1118_MySQL ERROR1118报错详解 Row size too large相关推荐

  1. mysql 1118_MySQL ERROR1118报错详解 Row size too large

    ERROR1118的报错信息分为两种: 1.ERROR 1118 (42000): Row size too large. The maximum row size for the used tabl ...

  2. MySQL ERROR1118报错详解

    ERROR1118的报错信息分为两种: 1.ERROR 1118 (42000): Row size too large. The maximum row size for the used tabl ...

  3. Mysql数据库结构同步时报错:Result: 1118 - Row size too large.

    今天在更新一个老数据库的结构时出现了这个问题,用的是Navicat的结构同步 看这报错意思是更改表结构时发现某行长度过长,但是实际上这张表并没有数据 实际上这是因为打开了数据库的严格检查模式 使用命令 ...

  4. python def函数报错详解_Python函数详解

    一.Python中函数的概念 1.python中函数概念 Python中函数是逻辑结构化和过程化的一种编程方法. 2.python中函数定义方法解释 def name(a): "The fu ...

  5. python def函数报错详解_python自定义函数def的应用详解

    这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...

  6. 安装linux子系统报错,详解win10电脑中安装linux子系统出现错误0x80070057方法

    现在很多的小伙伴在安装系统的时候都是选择安装双系统的操作的,那其实可以根据需求安装 Win10的系统还有linux系统的是很常见的开发用户的程序的选择,win10电脑就内置有linux子系统的,安装出 ...

  7. python def函数报错详解_JSer 快速入门 Python 之函数详解

    前一篇文章,用一天的时间,通过与 JavaScript 做对比的方式,快速领略了 Python 全貌. 梳理了那么多,若忽略细节差异,两门语言只有两个重要差异: 1.书写风格上大相同 2.功能覆盖上, ...

  8. Nginx安装配置报错详解

    *Nginx* ****正向代理:****客户端/浏览器-服务器 ****反向代理:****客户端-反向代理服务器-服务器 ****负载均衡:****将请求分发到多个不同的服务器 ****动静分离:* ...

  9. Win10DB210.1企业版的安装卸载DB2建库建表空间执行sql脚本SQL5005C、SQL8027N license许可证等报错详解

    注意事项 以下是我在使用DB2软件在过程中遇到的一系列的问题和报错,我将它们全部总结归纳在一起,希望对其他和我一样的同学能有帮助. ①.Win10的系统貌似是只支持DB210以上的版本的安装,我层尝试 ...

最新文章

  1. vs怎么编译php文件,vscode怎么初始编译
  2. VS2008中自定义C++工程模板与修改新建文件默认编码的办法
  3. MAC下安装多版本JDK和切换几种方式
  4. python执行系统命令的方法
  5. linux一级常用目录,小蚂蚁学习Linux(3)——Linux一级目录说明和常用命令解释...
  6. 大数据之-Hadoop伪分布式_配置启动HDFS_并运行MR程序---大数据之hadoop工作笔记0023
  7. 蓝桥2017真题剪邮票
  8. .NET企业级应用架构设计的技术选型
  9. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(2012年度笔试面试八十题)
  10. obs 推流编码在哪设置_OBS Studio基本设置
  11. 网络管理与维护(5.1)RMON 远程网络监视
  12. android 定时删除文件,使用安卓手机,记得定期清理这4个文件夹,可轻松释放大量空间...
  13. R语言使用lm函数拟合线性回归模型:使用predict函数和训练好的模型进行预测推理、使用ggplot2可视化预测值和实际值的曲线进行对比分析
  14. 腾讯编程比赛的试题,喜欢企鹅和编程的要进!
  15. 12:C语言之小球自由落体运动
  16. puppy linux4,发行版:Puppy Linux 4.00发布
  17. dw html自动补全,Dreamweaver CC
  18. 关键词单数和复数,ASO排名差距居然这么大
  19. 博客——使用 Redis 实现博客编辑的自动保存草稿功能
  20. 深入浅出了解撞库攻击!

热门文章

  1. mogilefsd同步速度调优
  2. lvs十种调度策略+三种模式
  3. 优云携手网易云 助力企业“互联网+”转型
  4. ROS学习之包的概念
  5. Eclipse导入import sun.misc.BASE64Decoder报错的解决办法
  6. c语言枚举类型变量的作用
  7. Python + Selenium 练习篇 - 获取页面所有邮箱
  8. Springmvc与Struts2不同
  9. 跨站请求伪造(CSRF)-简述
  10. 洛谷 P1013 进制位