返回顶部
首页 > 资讯 > 数据库 >关于MySQL中的一些极限值的初步验证纠错
  • 145
分享到

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

2024-04-02 19:04:59 145人浏览 八月长安
摘要

晚上从珠江边回来之后,看到一篇文章说,Mysql有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能通过手

晚上从珠江边回来之后,看到一篇文章说,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  <aaa.sql
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  <aaa.sql
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




您可能感兴趣的文档:

--结束END--

本文标题: 关于MySQL中的一些极限值的初步验证纠错

本文链接: https://lsjlt.com/news/49167.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于MySQL中的一些极限值的初步验证纠错
    晚上从珠江边回来之后,看到一篇文章说,MySQL有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能通过手...
    99+
    2024-04-02
  • 规则中的 ozzo 验证对于相等值返回错误
    问题内容 我有一个简单的代码,使用 echo 作为引擎,使用 ozzo-validation 作为请求验证器。 func (a MyRequest) Validate() error ...
    99+
    2024-02-06
  • MySQL中关于null值的一个小问题
        今天在测试null值的时候,发现了一个小问题,记录在这里,不知道大家以前遇到过没。     事情发展是这样的,在过滤一个表中的数值的时候,需要把age=2的列...
    99+
    2022-05-29
    MySQL null值 MySQL null值的问题
  • MySQL中关于主从同步时应该注意的问题有哪些
    MySQL中关于主从同步时应该注意的问题有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在我门准备好了两台数据库服务器的基础上1、须在主、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作