MySQL到底能有多少个字段

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

1.  官方文档说明

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

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()

运行结果如下:

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

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


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

2.2  测试MYISAM引擎表

因为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()

运行结果如下:

[[email protected] 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. 小结

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

表字段限制

表字段长度限制

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

原文地址:https://www.cnblogs.com/gjc592/p/12609153.html

时间: 2024-11-09 00:29:06

MySQL到底能有多少个字段的相关文章

Mysql到底是怎么实现MVCC的

Mysql到底是怎么实现MVCC的?这个问题无数人都在问,但google中并无答案,本文尝试从Mysql源码中寻找答案. 在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段: 6字节的事务ID(DB_TRX_ID ) 7字节的回滚指针(DB_ROLL_PTR) 隐藏的ID 6字节的事物ID用来标识该行所述的事务,7字节的回滚指针需要了解下Innodb的事务模型. 1. Innodb的事务相关概念 为了支持事务,Innbodb引入了下面几个概念:

MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了,对于问题的原因仍不知所以. 本文开始,记录学习<MySQL实战45讲>专栏的过程. 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分. 我知道关注公众号的小伙

MySQL中int类型的字段使用like查询方法

方法参考自: http://stackoverflow.com/questions/8422455/performing-a-like-comparison-on-an-int-field 也就是使用CAST转换指定字段,然后进行比较.具体样例代码如下: SELECT ProductID, ProductName FROM Products WHERE CAST(ProductID as CHAR) LIKE '%15%' 但是这样做的话,MySQL不能使用对应int字段索引,而且like本身就

mysql向表中某字段后追加一段字符串:

mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_name set field=CONCAT('str',field) MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串. 如果

MySQL到底能支持多大的数据量?

MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,再加上某些国内CMS厂商把数据承载量的责任推给它,导致很多不了解MySQL的站长对它产生了很多误解,那么,MySQL的数据量到底能支持多少呢?其实MySQL单表的上限,主要与操作系统支持的最大文件大小有关.我们来看一下官方的介绍. MySQL表最大能达到多少? MySQL 3.22 限制的表大小为4GB.由于在MySQL 3.23 中使用了MyISAM 存储引擎,最大表尺寸增加到了65536TB(2

Mysql 数据分组取某字段值所有最大的记录行

需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前.这是典型的排名表 +------+-------+--------------+---------------------+ | uid | level | role | time | +------+-------+--------------+---------------------+ | 7 | 1 | 摇滚圣魔 | 2014-06-12 15:01:0

高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

阅读(81374) | 评论(9)收藏16 淘帖1 赞3 JackJiang Lv.9    1 年前 | 前言 曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章<The C10K problem(英文在线阅读.英文PDF版下载.中文译文)>)的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了. 我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发

如何使用MySQL一个表中的字段更新另一个表中字段

这篇文章主要介绍了如何使用MySQL一个表中的字段更新另一个表中字段,需要的朋友可以参考下 1,修改1列 ? 1 2 3 update student s, city c set s.city_name = c.name where s.city_code = c.code; 2,修改多个列 ? 1 2 3 update a, b set a.title=b.title, a.name=b.name where a.id=b.id ?子查询 ? 1 update student s set ci

mysql下sql语句 update 字段=字段+字符串

原文:mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgreSQL 用 || 来连贯字符串) MySQL连贯字符串不能利用加号(+),而利用concat. 比方在aa表的name字段前加字符'x',利用: update aa set name=concat('x',name) 原文地址:https://www.cnblogs.com/lonelyxmas