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='')
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到底能有多少个字段的更多相关文章
- 懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)
需求描述 需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如 在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大 ...
- MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?
原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...
- mysql向表中某字段后追加一段字符串:
mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...
- MySQL中int类型的字段使用like查询方法
方法参考自: http://stackoverflow.com/questions/8422455/performing-a-like-comparison-on-an-int-field 也就是使用 ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
- (转载)Mysql使用Describe命令判断字段是否存在
(转载)http://www.jz123.cn/plus/view.php?aid=39200 工作时需要取得MySQL中一个表的字段是否存在 于是就使用Describe命令来判断 mysql_con ...
- mysql查询order by 指定字段排序
当MySQL查询时排序的字段不是数字时而是汉字的时候也可以用when then 来指定排序. 列如yewu_check表的status 字段不是0,1,2而是汉字待办,已办,退回.可以如下写法: S ...
- MySQL 到底能不能放到 Docker 里跑?
https://weibo.com/ttarticle/p/show?id=2309404296528549285581 前言 前几月经常看到有 MySQL 到底能不能放到 Docker 里跑的各种讨 ...
- MySQL中TEXT与BLOB字段类型的区别
这篇文章主要介绍了MySQL中TEXT与BLOB字段类型的区别,本文总结了6大区别,需要的朋友可以参考下 在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程 ...
随机推荐
- ansible使用指北(二)
前言在上一篇文章里我们了解了ansible的常用模块,今天我们来了解下ansible-playbook,ansbile-playbook是一系统ansible命令的集合,其利用yaml 语言编写,an ...
- (转载)Eclipse中使用SVN
为了方便个人使用,转载过来的,如需查阅,请前往原文地址:http://www.cnblogs.com/wvqusrtg/p/4993849.html 1.在Eclipse里下载Subclipse插件 ...
- date成字符串
//获取当前时间 Date date=new Date(); System.out.println("当前date: "+date); //将时间转化成yyyy-MM-dd格式的字 ...
- JS 获取一段时间内的工作时长小时数
本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...
- 前端复习笔记--1.html标签复习速查
概览 文档章节 <body> <header> <nav> 导航 <aside> 表示和主要内容不相关的区域 <article> 表示一个独 ...
- openwrt 上的 upnp wifi 音频推送 gmediarender
首先是必须启用的模块 Libraries ---> <*> libupnp Sound ---> <*> alsa-utils<*> madplay-a ...
- vnstat 流量统计 并附带一个小 php 查看流量的页面
安装apt-get install vnstat 配置到自动启动update-rc.d vnstat enable 启动/etc/init.d/vnstat start vnstat基本使用命令 vn ...
- flask 密码加密 视频资料
https://www.bilibili.com/video/av53870541/?p=33 通过在数据模型中定义函数来实现加密 from werkzeug.security import gene ...
- FSBPM流程引擎(002)之表单+自定义流程挂载到引擎
本章节介绍如何将实际业务的表单和自定义流程挂载到FSBPM流程引擎上. 首先进入引擎交互界面: 点击创建:->出差申请 然后根据实际的业务输入对应的数据项即可,比如[姓名,部门,开始时间,结束时 ...
- Nodejs:md5入门介绍及crypto模块的应用
简介 MD5(Message-Digest Algorithm)是计算机安全领域广泛使用的散列函数(又称哈希算法.摘要算法),主要用来确保消息的完整和一致性.常见的应用场景有密码保护.下载文件校验等. ...