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

相关推荐

  • 反诈困境,国有大行如何破局?[亲测有效]

    反诈困境,国有大行如何破局?[亲测有效]近年来,各类欺诈案件屡见报端,“金融造富”的骗局防不胜防。网上银行欺诈、电话银行欺诈、网络欺诈、电信欺诈、盗刷银行卡、POS机套现、贷款欺诈……庞大的利益诱惑下,金融诈骗黑产的水深不见底。各大银行风控

    2023-05-25
    152
  • 探秘MongoDB聚合查询

    探秘MongoDB聚合查询MongoDB是当前最流行的NoSQL数据库之一。在许多场景下,我们经常需要使用聚合查询来对数据进行分析和统计。聚合查询在MongoDB中是非常强大和灵活的,可以通过组合多个聚合操作符,对数据进行复杂的分析和转换。本文将深入介绍MongoDB聚合查询的基本概念和高级用法,通过实例代码和详细的解释,帮助大家更好地掌握MongoDB聚合查询。

    2024-05-09
    67
  • sql笔记[通俗易懂]

    sql笔记[通俗易懂]–创建用户① –GRANT(授权)REVOKE(回收权限)–创建用户create user 用户名 identified by 密码 GRANT CONNECT,RESOURCE TO 用户;G

    2023-05-29
    148
  • Mysql日期格式化为yyyymmdd_sql时间格式化

    Mysql日期格式化为yyyymmdd_sql时间格式化1 select DATE_FORMAT(dtl.transdate,'%Y-%m-%d') as transdate, 2 right(DATE_FORMAT(concat(tran

    2023-03-15
    156
  • 四平哪里可以开医院门诊发票-中国新闻网

    四平哪里可以开医院门诊发票-中国新闻网四平哪里可以开医院门诊发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,是Andro…

    2023-01-31
    151
  • 提高 Python 代码效率的实用技巧

    提高 Python 代码效率的实用技巧Python 是一种相对较慢的编程语言,但它非常流行并且有很多便于使用的库和工具。如果你正在使用 Python 编写大量的代码,那么如何提高代码的效率呢?在本文中,我们将从多个方面探讨 Python 代码的效率,并介绍一些实用技巧,以帮助大家更快地编写高效的 Python 代码。

    2023-12-06
    121
  • 使用Python设定编码

    使用Python设定编码在我们编写Python代码时,我们一定会用到各种编码方式,如UTF-8、GBK等。因为不同的编码方式会使得存储的数据呈现不同的显示效果,如果不设置编码方式,就有可能出现乱码等问题。

    2024-09-18
    20
  • centos7.2 数据库定时备份 crond实现(以kingbase7为例)

    centos7.2 数据库定时备份 crond实现(以kingbase7为例)项目上线时,经常需要定时对数据库进行备份,以应对不确定的环境和未知的问题。整理如下: crond是什么? crond 和crontab是不可分割的。crontab是一个命令,常见于Unix和类Uni…

    2022-12-16
    171

发表回复

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