MySQL到底能有多少个字段

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

1.  官方文档说明

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

 2.  测试表字段数限制

2.1  测试innodb引擎表

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

a) 建立一张1个 char(1) 类型的innodb表测试

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

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

#!/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()

运行结果以下:3d

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

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

 

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

 

 

2.2  测试MYISAM引擎表

由于MySQL中另外一种MYISAM引擎的表在MySQL5.7版本以前也是很是重要的存储引擎,只是后续版本使用愈来愈少,可是 仍是有必要测试一番。blog

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

#!/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 行受到影响

有图有真相

 

 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 行受到影响

给真相

 

3. 小结

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

表字段限制

 

表字段长度限制

 

 在此知识给个匆忙的小结,其中缘由不懂的能够查看官方文档,也是详细的测试,也能够加群一块儿讨论。

相关文章
相关标签/搜索