前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于MySQL极限值的初步验证纠错

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

作者头像
jeanron100
发布2018-03-22 12:08:33
6450
发布2018-03-22 12:08:33
举报

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

代码语言:javascript
复制
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  <aaa.sql
mysql  test  -e "show tables"

调用的时候只需要输入最大值即可。 比如,sh test.sh 1017发现确实如此,如果有107个int型字段是没有问题的,1018会抛出下面的错误。

代码语言:javascript
复制
# sh test.sh 1018
ERROR 1117 (HY000) at line 2: Too many columns
+----------------+
| Tables_in_test |
+----------------+
| test           |
| test_data      |
+----------------+

可见正如这位网友所说1017个字段,对于int型确实如此。 再进一步,我可以测试varchar类型,比如指定为varchar(20) 脚本略作修改

代码语言:javascript
复制
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  <aaa.sql
mysql  test  -e "show tables"

结果发现,1017个字段显然不行,怎么测试边界呢,我们可以使用二分法来快速迭代,比如1017不可以,我可以尝试500,如果500可以就尝试750,否则尝试250,以此类推。 很快得到了边界值,如果都是varchar(20),边界值是383

代码语言:javascript
复制
[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位的表名。

代码语言:javascript
复制
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就可以了。

代码语言:javascript
复制
mysql> create table  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (id int);
ERROR 1059 (42000): Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档