一、前言
最近在开发的时候,遇到一个报错:Can't create tablexxx(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
本文详细解析了MySQL中关于表列数的限制,包括不同版本和存储引擎(如InnoDB和MyISAM)的差异。指出MySQL5.5版本中表列数的硬限制为4096,但实际限制受多种因素影响。InnoDB表最多可达1000列,自5.6.9版本起增加到1017列。文章提供了针对列数超限的解决方案,并强调了参考官方手册的重要性。
4184





