mysql的表最多可设置多少字段?

一、前言

      最近在开发的时候,遇到一个报错: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官方手册之表列数限制和行限制

      按照官方手册说法,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

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值