千家信息网

关于MySQL中的一些极限值的初步验证纠错

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,晚上从珠江边回来之后,看到一篇文章说,MySQL有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能
千家信息网最后更新 2025年11月07日关于MySQL中的一些极限值的初步验证纠错晚上从珠江边回来之后,看到一篇文章说,MySQL有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能通过手工的方式来做,写个简单的脚本,能实现功能即可。
于是三下五除二,我写了下面的简单shelll脚本,跑一个循环,批量生成表结构信息。
首先我尝试的是int数据类型,脚本如下:

new=$1
echo 'drop table if exists test_new;' > aaa.sql
echo 'create table test_new(' >> aaa.sql
echo 'col1 int' >> aaa.sql
for ((i=2;i<=new;i++))
do
echo ,col_$i int
done >> aaa.sql
echo ');' >> aaa.sql

mysql test mysql test -e "show tables"
调用的时候只需要输入最大值即可。
比如,sh test.sh 1017发现确实如此,如果有107个int型字段是没有问题的,1018会抛出下面的错误。
# sh test.sh 1018
ERROR 1117 (HY000) at line 2: Too many columns
+----------------+
| Tables_in_test |
+----------------+
| test |
| test_data |
+----------------+
可见正如这位网友所说1017个字段,对于int型确实如此。
再进一步,我可以测试varchar类型,比如指定为varchar(20)
脚本略作修改
new=$1
echo 'drop table if exists test_new;' > aaa.sql
echo 'create table test_new(' >> aaa.sql
echo 'col1 varchar(20)' >> aaa.sql
for ((i=2;i<=new;i++))
do
echo ,col_$i varchar\(20\)
done >> aaa.sql
echo ');' >> aaa.sql

mysql test mysql test -e "show tables"

结果发现,1017个字段显然不行,怎么测试边界呢,我们可以使用二分法来快速迭代,比如1017不可以,我可以尝试500,如果500可以就尝试750,否则尝试250,以此类推。
很快得到了边界值,如果都是varchar(20),边界值是383
[root@oel642 ~]# sh aa.sql 384
ERROR 1118 (42000) at line 2: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
+----------------+
| Tables_in_test |
+----------------+
| test |
| test_data |
+----------------+
显然可以充分印证上面的结论还是不够严谨的,而至于细节的原因我们可以继续深入,后续继续分析下。
同理我们可以2分钟内模拟下表名的最大长度,我们知道MySQL里指定的最大长度是64,我们可以使用lpad来实现。
生成64位的表名。
mysql> select lpad('a',64,'a');
+------------------------------------------------------------------+
| lpad('a',64,'a') |
+------------------------------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create table aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (id int);
Query OK, 0 rows affected (0.09 sec)
都不用迭代,只需要补充一个a就可以了。
mysql> create table aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (id int);
ERROR 1059 (42000): Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long




字段 脚本 尝试 最大 边界 面的 验证 只有 时候 类型 长度 测试 生成 迭代 极限 极限值 不行 严谨 三下五除二 以此类推 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手机软件开发app相关课程 网络安全宣传周 活动主题 数据库外键怎么只显示数字 fms服务器 下载 洛阳中创网络技术服务怎么样 gb协议中服务器码流类型 华生网络技术有限公司 数据库管理师有这个证书吗 数据库搜索重复数据 五年级网络安全靠大家手抄报 网络安全之红队总结 绍兴隆信网络技术有限公司 上虞 软件开发每天的报价是多少钱 苏州培训软件开发 虹口区正规软件开发智能系统 曹戈展硕网络技术服务有限公司 安全管理数据库设计 计算机网络安全不稳定 服务器电源背板改pc 高科技产业是互联网 太原东杰软件开发有限公司 安徽智能软件开发维修价格 浙江服务器电源特点 超欧网络技术公司 智慧教学管理软件开发公司 花粉蛋白数据库 哪种是网络服务器 苏州计算机软件开发需要多少钱 中心策略管理服务器 网络安全影响国家安全事件
0