关于MySQL中的一些极限值的初步验证纠错
发表于:2024-10-02 作者:千家信息网编辑
千家信息网最后更新 2024年10月02日,晚上从珠江边回来之后,看到一篇文章说,MySQL有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能
千家信息网最后更新 2024年10月02日关于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 testmysql 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 testmysql 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
于是三下五除二,我写了下面的简单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
调用的时候只需要输入最大值即可。
比如,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
结果发现,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安全错误
数据库的锁怎样保障安全
软件开发和手工艺的区别
党管网络安全实践与思考
web 服务器搭建
如何实施网络安全饿策略
梦幻西游22年服务器
软件开发与项目管理方向
创造与魔法服务器不同能一起玩吗
买完服务器我该怎么使用
华为软件开发者选项
网络安全以赛促学意义
电机数据库
ftp和普通服务器
EXCEED下载软件开发
软件开发费用会计处理
互联网科技公司规章制度
文献数据库有些啥
宝山区市场软件开发销售方法
帝国神话如何开自定义服务器
数据库不完善会有什么后果
上海市同森网络技术有限公司
党管网络安全实践与思考
软件开发需要证件不
phpmongodb数据库
在sql中建立新数据库表
知网数据库官网
车辆管理数据库设计doc
网络安全与健康成长班会
南开网络安全攻防基础期末
山东服务器维护定制
系统数据库的简称