• ADADADADAD

    关于MySQL中的一些极限值的初步验证纠错[ mysql数据库 ]

    mysql数据库 时间:2024-12-03 12:12:11

    作者:文/会员上传

    简介:

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

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

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




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

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysql验证一些