91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于MySQL中的一些極限值的初步驗證糾錯

發布時間:2020-08-12 22:41:26 來源:ITPUB博客 閱讀:127 作者:jeanron100 欄目:MySQL數據庫
晚上從珠江邊回來之后,看到一篇文章說,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




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

周宁县| 蓬莱市| 抚松县| 秦皇岛市| 海门市| 大庆市| 枣强县| 西盟| 崇州市| 三门峡市| 济宁市| 全椒县| 福海县| 昌都县| 土默特左旗| 永胜县| 松阳县| 四会市| 佛坪县| 旅游| 依兰县| 邹平县| 鹤山市| 铁岭市| 敖汉旗| 高密市| 乐陵市| 九江县| 桃江县| 普洱| 青神县| 苍溪县| 英山县| 霞浦县| 中西区| 双牌县| 灵石县| 揭东县| 富裕县| 耒阳市| 抚宁县|