MySQL表字段数量限制及行大小限制详情


Posted in MySQL onJuly 23, 2022

字段数量限制 Column Count Limits

MySQL对于每个表的字段数量是严格控制在4096个,但是实际情况下的限制大小取决于以下因素(也就是基本达不到4096就被限制了):

  • 表的行最大的row size会限制字段数量,如果当前row size过大就不能加字段了
  • The storage requirements of individual columns constrain the number of columns that fit within a given maximum row size.
  • 存储引擎本身也会对字段数量有限制,比如Innodb最大字段数量为1017
  • 每张表都有一个后缀为.frm的表定义文件,表定义可能会影响字段数量大小

行大小限制 Row Size Limits

row size由以下因素影响:

  • MySQL本身对row size有硬性规定,不能超过65535bytes,即使存储引擎允许更大的size. 而BLOBTEXT类型列只占行的9到12个字节,具体存储地方不在该行里;但是其他的比如varchar还是算在行里的,这里要注意
  • Innodb存储引擎对于每行的大小一般限制为页大小的一半:页16KB,row size 8KB。另外对于不定长类型也有不同:If a row containing variable-length columns exceeds the InnoDB maximum row size, InnoDB selects variable-length columns for external off-page storage until the row fits within the InnoDB row size limit. The amount of data stored locally for variable-length columns that are stored off-page differs by row format. For more information, see InnoDB Row Formats.简单来说就是,对于像varchar这种不定长类型,如果这种类型长度超过了Innodb存储引擎规定的row size,那么Innodb会选择页外存储直到行大小符合Innodb存储引擎规定的row size。(但是即使这样也不能超过65535B,即65535B是包含不定长列中的内容的长度)
  • Different storage formats use different amounts of page header and trailer data, which affects the amount of storage available for rows. Row Size Limit Examples 65535B限制
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;
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

看,由于Latin1编码1个字符是1个字节,总共不能超过65535个字符,超过就报错;而常用的utf8mb4编码最多1个字符占用4个字节,所以当使用utf8mb4编码时,最多只能有65535/4=16383个字符(实际测肯定会小点,因为还有字节去记录变长字段长度):

test> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(6384)
             ) ENGINE=InnoDB CHARACTER SET utf8mb4
[2022-07-21 15:05:56] [42000][1118] 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

test> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(6383)
             ) ENGINE=InnoDB CHARACTER SET utf8mb4
[2022-07-21 15:09:51] [42000][1118] 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
test> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(6382)
             ) ENGINE=InnoDB CHARACTER SET utf8mb4
[2022-07-21 15:09:58] completed in 33 ms

根据提示,如果超过row size限制,可以使用TEXT or BLOBs类型,这个在row size中只占用9到12个字节。

8126B限制

65535B的限制主要针对不定长类型的限制,而定长类型的限制更为严格,像在Innodb存储引擎中,只能达到8KB多也就是页大小的一半(可以修改)。

innodb_strict_mode is enabled in the following example to ensure that InnoDB returns an error if the defined columns exceed the InnoDB row size limit. When innodb_strict_mode is disabled (the default), creating a table that uses REDUNDANT or COMPACT row format succeeds with a warning if the InnoDB row size limit is exceeded.

mysql> SET SESSION innodb_strict_mode=1;
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;
ERROR 1118 (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.

Row Limits总结

Row Limits 一般为 MySQL本身65535B限制和存储引擎8126B限制(默认Innodb)。

  • 针对不定长类型,如varchar,一般首先收到限制的是MySQL本身65535B的限制。受不到存储引擎限制是因为,不定长类型如果长度超过8126B,会采用页外存储,也就是不定长类型的长度过长的话计入65535B而不计入8126B(大致可以这么理解)。
  • 针对定长类型,首先会受到存储引擎8126B限制。

到此这篇关于MySQL表字段数量限制及行大小限制详情的文章就介绍到这了,更多相关MySQL行大小限制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL基础(一)
Apr 05 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
MySQL 重命名表的操作方法及注意事项
May 21 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
优化Mysql查询的示例
Apr 26 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySQL数据库之存储过程 procedure
Jun 16 MySQL
MySQL分布式恢复进阶
Jul 23 #MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 #MySQL
MySQL池化框架学习接池自定义
Jul 23 #MySQL
mysql sock文件存储了什么信息
Jul 15 #MySQL
mysql sock 文件解析及作用讲解
Jul 15 #MySQL
mysqldump进行数据备份详解
Jul 15 #MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 #MySQL
You might like
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
js几个验证函数代码
2010/03/25 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python CSV模块使用实例
2015/04/09 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
python异常处理和日志处理方式
2019/12/24 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
HSRP的含义以及如何工作
2014/09/10 面试题
实习教师个人的自我评价
2013/11/08 职场文书
文秘专业应届生求职信范文
2013/11/14 职场文书
yy生日主持词
2014/03/20 职场文书
品牌宣传方案
2014/03/21 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
合作意向书范本
2019/04/17 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang