发布网友 发布时间:2022-05-03 07:31
共2个回答
懂视网 时间:2022-05-03 11:52
!/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()运行结果如下:
[root@testdb python_pro]# python test_column.py Mysql Error 1117: Too many columns MySQL has a limit of 1017
在SQLyog客户端手动验证也是同样的结果
因此,官方文档中介绍的MySQL innodb引擎表最多有1017个字段。
因为MySQL中另一种MYISAM引擎的表在MySQL5.7版本之前也是非常重要的存储引擎,只是后续版本使用越来越少,但是 还是有必要测试一番。
程序思路与测试innodb是均一致,只是将表的引擎进行修改,如下:
#!/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个字段。
大家都知道的一个知识是在MySQL中一行除了blob及text类的大字段之外,其余字段的长度之和不能超过65535,那么这个是确定的么,因此再次做一次测试。
创建一个只有一个字段的表,字段长度为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 行受到影响
有图有真相
因为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到底能有多少个字段
标签:sqlyog odi arc 类型 长度 varchar div exists img
热心网友 时间:2022-05-03 09:00
您好: