一、前言
最近在开发的时候,遇到一个报错:Can't create table
xxx(errno: 185 "Too many columns")
根据英文,意思是表的字段太多了,那么mysql
的数据表最多能有多少列呢?
怀着虔诚的心态打开百度,连着搜了好几篇文章,答案都一模一样:
mysql每个表要求的最大列是1024,每个数据库最多可创建20亿个表等等?????
是的,大家都这么说,但是这个1024
是哪里来的呢,有科学依据(官方承认)吗?博主算了下自己的表,只有1008
个字段左右,很明显是不超过1024
的,但是还是报错了。这么看来,这个1024
列的说法也不过是以讹传讹罢了。下面我们来扒一扒那些官方的说法。
二、mysql官方回答
1、MySQL 5.5官方给出的说法
MySQL
对每个表有4096
列的硬限制,但是对于给定的表,有效最大值可能会更少。确切的列限制取决于几个因素:
(1)表的最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过该大小。
请参阅 行大小限制。
(2)单个列的存储要求限制了给定最大行大小内的列数。某些数据类型的存储要求取决于存储引擎,
存储格式和字符集等因素。请参见第11.7节“数据类型存储要求”。
(3)存储引擎可能会施加其他限制表列计数的限制。例如, InnoDB每个表最多有1000列。
请参见第14.24节“ InnoDB限制”。有关其他存储引擎的信息,请参见 第15章,备用存储引擎。
(4)每个表都有一个.frm包含表定义的文件。该定义以可能影响表中允许的列数的方式影响此
文件的内容。请参见 .frm文件结构施加的限制。
按照官方手册说法,mysql
的表可以有4096
列,但是博主这次建表,顶多1000
字段出头,怎么算都没有超标啊。可能是和存储引擎有关?
2、InnoDB表的最大列长度
一个表最多可以包含1000列。
一个表最多可以包含64个 二级索引。
默认情况下,索引键前缀长度限制为767个字节
......
以上是手册上的说法,原来Innodb
的表果然限制更多一些,注意是最多可以有1000列!而不是1024
列,网上有些说法是错误的,不要轻信。
参考:Innodb引擎的列
3、根据手册总结一下
(1)innodb
引擎对于列的硬性要求是不能超过1000列
,MyISAM
引擎能达到4096
的限制
(2)一个表最多可以包含64个
二级索引,两种引擎都有这个限制。
(3)索引键前缀长度限制为767
个字节 ,参考:innodb主键的长度为什么不能大于767字节
(4)MySQL
本身对所有列的组合大小强加了65535
的行大小限制,这个更多对应单个列的字段长度不能大于65535
字节
三、解决方案以及其他
(1)创建表的时候,选择myisam引擎即可
(2)减少列的长度,当表的列长度大于1000个字段,那么应该是设计上出问题了
(3)没事多看手册,网上一搜清一色都是1024列,俺也不知道他们是怎么算出来的。
============== 2019/12/17=================
以上的1000列限制只适用于 5.6.9版本以下,mysql从大于5.6.9开始,innodb的列限制改为1017列!
手册地址: https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html
最后,相信手册的力量!
end