關於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
於是三下五除二,我寫了下面的簡單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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2147772/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於MySQL極限值的初步驗證糾錯(二)MySql
- 關於量子技術的一些概念糾正
- 關於軟體驗證中的單元測試
- 基於機器學習的糾錯系統技術 - 智慧文字糾錯 API機器學習API
- 關於Canvas的一些經驗Canvas
- 關於Java Mail的身份驗證!JavaAI
- Apache基於MySQL的身份驗證(轉)ApacheMySql
- 《關於MySQL的一些騷操作》MySql
- 關於MySQL的一些小見解MySql
- 關於MySQL event的一些整理MySql
- 關於值物件的驗證的問題物件
- [TEAP]關於Canvas的一些經驗Canvas
- 關於SSL證書的一些介紹
- ACCESS 關於表設計中,驗證規則的使用技巧
- 關於Mysql使用的一些總結MySql
- MySql關於鎖的一些總結MySql
- 關於 MySQL 索引的一些認識MySql索引
- 海明校驗碼檢錯和糾錯的工作原理
- 關於糾結的recycle pool的設定
- 英文簡歷中關於專案經驗的一些有用的例子
- 關於URL優化的一些經驗優化
- 利用puppeteer破解極驗的滑動驗證
- angular中關於表單動態驗證的一種新思路Angular
- Asp.net中基於Forms驗證的角色驗證授權ASP.NETORM
- 5.3. 驗證 Seam安全中的驗證特性是基於JAAS
- 關於Android平臺中OpenGLES應用的初步研究Android
- 關於mysql 1067的錯誤MySql
- 關於MySQL-MMM架構的一些報錯及解決方法薦MySql架構
- 關於Vue的元件與模板的初步理解Vue元件
- 關於Dart中Future的一些理解Dart
- 關於Swift中Properties的一些理解Swift
- mysql練習 —— 關於一些函式的使用MySql函式
- 關於Laravel的表單驗證分層設計以及驗證場景的應用Laravel
- Jive筆記1--關於Jive1中的驗證和相關類的呼叫 (轉)筆記
- 關於laravel上傳的檔案驗證或者的表示?Laravel
- 11g新特性 密碼錯誤驗證延遲特性的相關驗證密碼
- 關於啟用 HTTPS 的一些經驗分享HTTP
- 關於使用者體驗的一些總結