MySQL到底能有多少个字段[亲测有效]

MySQL到底能有多少个字段[亲测有效]今天技术讨论群里 “一切随遇而安”同学看书时出现一个疑问,一个MySQL的表中到底可以有多少个字段?带着这个疑问,我们展开了探讨,也接着讨论了一个单字段长度的问题。 1. 官方文档说明 官方文档的内容

MySQL到底能有多少个字段

今天技术讨论群里 “一切随遇而安”同学看书时出现一个疑问,一个MySQL的表中到底可以有多少个字段?带着这个疑问,我们展开了探讨,也接着讨论了一个单字段长度的问题。

1.  官方文档说明

官方文档的内容如下,主要意思是字段个数限制达不到理想的4096个,且和字段类型有关,innodb引擎的字段上限是1017,。

MySQL到底能有多少个字段[亲测有效]

 2.  测试表字段数限制

2.1  测试innodb引擎表

因官方文档介绍了innodb表字段限制是1017,因此可以写程序进行模拟。思路如下:

a) 创建一张1个 char(1) 类型的innodb表

b)   循环往该表新增字段 直至报错

我使用的是python 脚本进行测试,脚本如下:

#!/usr/bin/python
# coding=utf-8
import pymysql as mdb
import os

sor_conn = mdb.connect(host="127.0.0.1",port=3306,user="root",passwd="123456")
sor_cur = sor_conn.cursor()

v_sql_d = "drop table  if exists test.test_c ;"   # 为了程序重复执行,添加判断

sor_cur.execute(v_sql_d)
sor_conn.commit()
v_sql_c = "create table test.test_c(c1 char(1))  engine=innodb;"
sor_cur.execute(v_sql_c)
sor_conn.commit()
v_id=2
while v_id<50000:
        v_sql_add_c = " alter table test.test_c  add c%d char(1);"%(v_id)

        try:
                sor_cur.execute(v_sql_add_c)
                sor_conn.commit()
        except mdb.Error,e:
                v_cnt = v_id - 1
                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                print "MySQL has a limit of %d" %(v_cnt)
                break
        v_id = v_id + 1
sor_conn.close()

代码100分

运行结果如下:

代码100分[root@testdb python_pro]# python test_column.py 
Mysql Error 1117: Too many columns
MySQL has a limit of 1017

在SQLyog客户端手动验证也是同样的结果

MySQL到底能有多少个字段[亲测有效]


 

因此,官方文档中介绍的MySQL innodb引擎表最多有1017个字段。

 

 

2.2  测试MYISAM引擎表

因为MySQL中另一种MYISAM引擎的表在MySQL5.7版本之前也是非常重要的存储引擎,只是后续版本使用越来越少,但是 还是有必要测试一番。

程序思路与测试innodb是均一致,只是将表的引擎进行修改,如下:

代码100分#!/usr/bin/python
# coding=utf-8
import pymysql as mdb
import os
import datetime
import time

sor_conn = mdb.connect(host="127.0.0.1",port=3306,user="root",passwd="123456")
sor_cur = sor_conn.cursor()

v_sql_d = "drop table  if exists test.test_c ;"

sor_cur.execute(v_sql_d)
sor_conn.commit()
v_sql_c = "create table test.test_c(c1 char(1))engine=MYISAM ;"
sor_cur.execute(v_sql_c)
sor_conn.commit()
v_id=2
while v_id<50000:
        v_sql_add_c = " alter table test.test_c  add c%d char(1);"%(v_id)

        try:
                sor_cur.execute(v_sql_add_c)
                sor_conn.commit()
        except mdb.Error,e:
                v_cnt = v_id - 1
                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                print "MySQL has a limit of %d" %(v_cnt)
                break
        v_id = v_id + 1
sor_conn.close()

运行结果如下:

[root@testdb python_pro]# python test_column.py 
Mysql Error 1117: Too many columns
MySQL has a limit of 2598

也就是说MySQL中MyISAM引擎表最多可以存2598个字段。

 

3.  测试字段长度限制

大家都知道的一个知识是在MySQL中一行除了blob及text类的大字段之外,其余字段的长度之和不能超过65535,那么这个是确定的么,因此再次做一次测试。

3.1  测试UTF8字符集

创建一个只有一个字段的表,字段长度为65535 结果居然报错了,提示最大长度只能是21845,也就是65535/3的量,

/*  测试单字段长度 上限*/
CREATE  TABLE  test_c1(
c1 VARCHAR(65535)
) ENGINE=INNODB CHARACTER SET utf8;
/* 执行结果 */
错误代码: 1074
Column length too big for column "c1" (max = 21845); use BLOB or TEXT instead

但是改为21845依旧报错,原因你仔细品(提示varchar)

CREATE  TABLE  test_c1(
c1  VARCHAR(21845) 
) ENGINE=INNODB CHARACTER SET utf8;

/* 执行结果依旧报错 */
错误代码: 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

那,在减小一位试试

CREATE  TABLE  test_c1(
c1  VARCHAR(21844) 
) ENGINE=INNODB CHARACTER SET utf8;
/* 终于成功了*/
查询:create table test_c1( c1 varchar(21844) ) engine=innodb character set utf8

共 0 行受到影响

有图有真相

MySQL到底能有多少个字段[亲测有效]

 

 3.2  测试latin字符集

因为utf8编码占3位,因此最大长度只能是21845(-1),那么latin字符集是不是就能达到65535了

测试如下

CREATE  TABLE  test_c1(
c1  VARCHAR(65535) 
) ENGINE=INNODB CHARACTER SET latin1
/* 结果依旧失望 */
错误代码: 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

在想想上面的情况,一直减下去,发现65532即可正常(原因你继续品就明白了)

CREATE  TABLE  test_c1(
c1  VARCHAR(65532) 
) ENGINE=INNODB CHARACTER SET latin1;
/* 终于成功了 */
<n>查询:create table test_c1( c1 varchar(65532) ) engine=innodb character set latin1

共 0 行受到影响

给真相

MySQL到底能有多少个字段[亲测有效]

 

3. 小结

实践出真知,任何人说的知识点都要思考,必要的时候自己检验一番。

表字段限制

MySQL到底能有多少个字段[亲测有效]

 

表字段长度限制

MySQL到底能有多少个字段[亲测有效]

 

 在此知识给个匆忙的小结,其中原因不懂的可以查看官方文档,也是详细的测试,也可以加群一起讨论。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9237.html

(0)
上一篇 2023-02-12
下一篇 2023-02-12

相关推荐

  • Python中NumPy的高效数学计算和数据分析

    Python中NumPy的高效数学计算和数据分析NumPy是一个Python第三方库,拥有自己的数据类型和一些数组操作的方法。正是由于这些特点,NumPy成为了Python科学计算的核心库之一。

    2024-03-12
    36
  • 使用Python绘制散点图

    使用Python绘制散点图散点图是一种以点的位置为坐标,以变量的值为数据的图表形式,用于观察两个变量之间的关系是否存在某种模式、趋势或异常值。在数据科学领域,散点图经常用于探索性数据分析和建模。

    2024-05-01
    16
  • Mysql工作日志「终于解决」

    Mysql工作日志「终于解决」1. DISTINCT效率极差,可以选择替换groupby,最好能在代码内部去重 2. filesort效率也很低 3. 能使用连接查询尽量不要使用子查询 4. in查询包含内容很多的情况下,不要通…

    2023-03-22
    102
  • redis5.0.4_redis源码阅读

    redis5.0.4_redis源码阅读redis中压缩列表ziplist相关的文件为:ziplist.h与ziplist.c 压缩列表是redis专门开发出来为了节约内存的内存编码数据结构。源码中关于压缩列表介绍的注释也写得比较详细。 一

    2023-01-27
    103
  • druid配置_druid配置登录

    druid配置_druid配置登录DruidDataSource配置兼容DBCP,但个别配置的语意有所区别。 配置 缺省值 说明 name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将

    2023-03-20
    105
  • dbeaver连接hive kerberos_dbeaver连接sqlserver

    dbeaver连接hive kerberos_dbeaver连接sqlserver如何使用DBeaver连接Hive

    2023-06-07
    103
  • SQL索引(索引优化)

    SQL索引(索引优化)SQL索引 若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下原则 #1.最左前缀匹配原则,非常重要的原则, create index ix_name_email on s1(…

    2023-02-15
    107
  • Python判断是否为空

    Python判断是否为空在编写Python程序时,我们常常需要对数据进行空值判断,以便在后续代码中避免出现错误或异常。本文将从多个方面详细介绍Python中的判断是否为空的方法,帮助读者更好地理解和运用这一常用操作。

    2024-04-25
    14

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注