晚上從珠江邊回來之后,看到一篇文章說,MySQL有幾個(gè)極限值,一個(gè)表的字段最多只有1017個(gè),我看了以后表示懷疑。怎么快速驗(yàn)證呢,我看到文章的時(shí)候已經(jīng)11點(diǎn)了,只有不到1個(gè)小時(shí)的時(shí)間來驗(yàn)證了。我想不能通過手工的方式來做,寫個(gè)簡單的腳本,能實(shí)現(xiàn)功能即可。
于是三下五除二,我寫了下面的簡單shelll腳本,跑一個(gè)循環(huán),批量生成表結(jié)構(gòu)信息。
首先我嘗試的是int數(shù)據(jù)類型,腳本如下:
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"
調(diào)用的時(shí)候只需要輸入最大值即可。
比如,sh test.sh 1017發(fā)現(xiàn)確實(shí)如此,如果有107個(gè)int型字段是沒有問題的,1018會(huì)拋出下面的錯(cuò)誤。
# sh test.sh 1018
ERROR 1117 (HY000) at line 2: Too many columns
+----------------+
| Tables_in_test |
+----------------+
| test |
| test_data |
+----------------+
可見正如這位網(wǎng)友所說1017個(gè)字段,對(duì)于int型確實(shí)如此。
再進(jìn)一步,我可以測(cè)試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"
結(jié)果發(fā)現(xiàn),1017個(gè)字段顯然不行,怎么測(cè)試邊界呢,我們可以使用二分法來快速迭代,比如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 |
+----------------+
顯然可以充分印證上面的結(jié)論還是不夠嚴(yán)謹(jǐn)?shù)?,而至于?xì)節(jié)的原因我們可以繼續(xù)深入,后續(xù)繼續(xù)分析下。
同理我們可以2分鐘內(nèi)模擬下表名的最大長度,我們知道MySQL里指定的最大長度是64,我們可以使用lpad來實(shí)現(xiàn)。
生成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)
都不用迭代,只需要補(bǔ)充一個(gè)a就可以了。
mysql> create table aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (id int);
ERROR 1059 (42000): Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long
本文標(biāo)題:關(guān)于MySQL中的一些極限值的初步驗(yàn)證糾錯(cuò)
分享URL:http://www.rwnh.cn/article6/jddhig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、建站公司、品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)