今天技术讨论群里 “一切随遇而安”同学看书时出现一个疑问,一个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='')
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个字段。

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='')
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. 小结

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

表字段限制

表字段长度限制

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

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

  1. 懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)

    需求描述 需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如 在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大 ...

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

    原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...

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

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

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

    方法参考自: http://stackoverflow.com/questions/8422455/performing-a-like-comparison-on-an-int-field 也就是使用 ...

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

    mysql下sql语句 update 字段=字段+字符串   mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...

  6. (转载)Mysql使用Describe命令判断字段是否存在

    (转载)http://www.jz123.cn/plus/view.php?aid=39200 工作时需要取得MySQL中一个表的字段是否存在 于是就使用Describe命令来判断 mysql_con ...

  7. mysql查询order by 指定字段排序

    当MySQL查询时排序的字段不是数字时而是汉字的时候也可以用when  then 来指定排序. 列如yewu_check表的status 字段不是0,1,2而是汉字待办,已办,退回.可以如下写法: S ...

  8. MySQL 到底能不能放到 Docker 里跑?

    https://weibo.com/ttarticle/p/show?id=2309404296528549285581 前言 前几月经常看到有 MySQL 到底能不能放到 Docker 里跑的各种讨 ...

  9. MySQL中TEXT与BLOB字段类型的区别

    这篇文章主要介绍了MySQL中TEXT与BLOB字段类型的区别,本文总结了6大区别,需要的朋友可以参考下   在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程 ...

随机推荐

  1. Git pull 卡在Unpacking objects

    今天在拉取远程仓库的时候在Unpacking objects阶段 进度条卡住,不知道什么原因. 翻取相关资料搜索后得知:在拉取大型二进制对象(如Adobe Illustrator文件等)可能会使整个拉 ...

  2. C++走向远洋——58(项目二3、动物这样叫、改进版)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. [红日安全]Web安全Day4 - SSRF实战攻防

    本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...

  4. 成长日记(2) Java面向对象

    本篇主要是记录自己在学习路上的笔记,如果有哪里记错了请大家直接指出 面向对象的概念 *人为抽象的一种编程模型 *面向过程 代码集中 难以维护 *类:对事物 算法 逻辑 概念等的抽象 理解成 模板 图纸 ...

  5. CentOS 7 国内源配置

    CentOS 7 国内源配置 1. 备份自带源 # 首先要确认你有 wget 命令, 并且连着网 # cd /etc/yum.repos.d/ # mkdir repo # mv *.repo rep ...

  6. SpringBoot入门系列(三)资源文件属性配置

    前面介绍了Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据.不清楚的朋友可以看看之前的文章:https://www.cnbl ...

  7. 原型模式故事链(3)--JS的数据类型、以及区别、区分、转化

    上一章--原型链讲解:传送门:https://segmentfault.com/a/11... 在上一章讲解原型链时提到了:所有的引用类型都有一个_proto_属性,称之为隐式原型.那么引用类型是什么 ...

  8. 使用VMware12在CentOS7上部署docker实例

    今天下午算是自己搞了一下午才搞出来,对于认为linux是自己死穴的我,现在能搞出来,心里滋味不是一丢丢,哈哈~~~ 算了,废话不多说,直接上图!步骤如下: 1.在安装好VMware12并安装好了cen ...

  9. 基于springboot1.5.9整合shiro时出现静态文件找不到的问题

    开门见山吧,上午对shiro进行整合了下,因为之前使用ssm框架对shiro框架整合过,所以觉得使用springboot再次对shiro框架进行整合也是没啥问题,但最后整合完之后,使用thymelea ...

  10. C++ STL迭代器原理和简单实现

    1. 迭代器简介 为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector.list.map.set等.然而有些容器(vector)可以 ...