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

  晚上从珠江边回来之后,看到一篇文章说,MySQL有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能通过手工的方式来做,写个简单的脚本,能实现功能即可。
  于是三下五除二,我写了下面的简单shelll脚本,跑一个循环,批量生成表结构信息。
  首先我尝试的是int数据类型,脚本如下:
  
  新
=1美元   回声”drop table test_new如果存在,“比;aaa.sql
  回声“创建表test_new(”,祝辞的在aaa.sql
  回声col1 int的祝辞祝辞aaa.sql
  ((我=2;i<=new;我+ +))
  做
  呼应,col_ $ i int
  done 在比;aaa.sql
  回声”),“在祝辞aaa.sql
  
  mysql test & lt; aaa。sql
  mysql test - e“显示表”
  调用的时候只需要输入最大值即可。
  比如,sh测试。sh 1017发现确实如此,如果有107个int型字段是没有问题的,1018会抛出下面的错误。
  #上海测试。sh 1018
  错误1117 (HY000)线2:太多的列
  + - - - - - - - - - - - - - - - - - +
  | Tables_in_test |
  + - - - - - - - - - - - - - - - - - +
  | test ,,,,,,,,,|
  | test_data ,,,,|
  + - - - - - - - - - - - - - - - - - +
  可见正如这位网友所说1017个字段,对于int型确实如此。
  再进一步,我可以测试varchar类型,比如指定为varchar (20)
  脚本略作修改
  新
=1美元   回声”drop table test_new如果存在,“比;aaa.sql
  回声“创建表test_new(”,祝辞的在aaa.sql
  回声col1 varchar(20)的祝辞祝辞aaa.sql
  ((我=2;i<=new;我+ +))
  做
  呼应,col_ $ i varchar \ (20 \)
  done 在比;aaa.sql
  回声”),“在祝辞aaa.sql
  
  mysql test & lt; aaa。sql
  mysql test - e“显示表”
  
  结果发现,1017个字段显然不行,怎么测试边界呢,我们可以使用二分法来快速迭代,比如1017年不可以,我可以尝试500,如果500可以就尝试750,否则尝试250,以此类推。
  很快得到了边界值,如果都是varchar(20),边界值是383
  root@oel642 ~ # sh aa。sql 384
  在第2行错误1118(42000):行大小太大(比;8126)。改变一些文本或BLOB列可能会有所帮助。在当前行格式,BLOB前缀0字节以内联方式存储。
  + - - - - - - - - - - - - - - - - - +
  | Tables_in_test |
  + - - - - - - - - - - - - - - - - - +
  | test ,,,,,,,,,|
  | test_data ,,,,|
  + - - - - - - - - - - - - - - - - - +
  显然可以充分印证上面的结论还是不够严谨的,而至于细节的原因我们可以继续深入,后续继续分析下。
  同理我们可以2分钟内模拟下表名的最大长度,我们知道MySQL里指定的最大长度是64年,我们可以使用lpad来实现。
  生成64位的表名。
  mysql>,选择lpad (' a ', 64 a),
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
  | lpad(64年' a ', ' a '),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
  | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
  1行集(0.00秒)
  mysql>创建table aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (int id);
  查询好,0行影响(0.09秒)
  都不用迭代,只需要补充一个一个就可以了。
  mysql>创建table aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (int id);
  错误1059(42000):标识符名称“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”太长
  
  
  
  

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