MySQL中需要注意的欄位長度問題
在MySQL的表結構設計中,突然想起來幾個地方碰到的問題比較多,大體來說一個就是字符集,一個就是資料型別。
而字符集和資料型別結合起來,就有一個蠻有意思的細節,那就是行長度的問題。
比如我們建立一個表使用了varchar的型別,如果指定為gbk,表裡含有一個欄位,可以指定為32766位元組,如果再長一些就不行了。
其中的計算方式就需要理解了,因為varhcar型別長度大於255,所以需要2個位元組儲存值的長度,而MySQL裡面的頁的單位是16k,使用了IOT的方式來儲存。所以如果超過了這個長度,那就會有溢位的情況,和Oracle的overflow很類似。
所以對於gbk型別,行長度最大為65535,則varchar列的最大長度演算法就是 (65535-2)/2 =32766.5,所以此處就是32766了。
> create table test_char(v varchar(32766)) charset=gbk;
Query OK, 0 rows affected (0.00 sec)
> create table test_char1(v varchar(32767)) charset=gbk;
ERROR
1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs而另外一種字符集,也是預設的字符集latin1,有些系統支援火星文的還是會喜歡用這種字符集。
它的長度就不一樣了,對應是1位元組,所以varchar(32767)是沒有任何問題的,而最大長度就是65532了。
> create table test_char1(v varchar(32767)) charset=latin1;
Query OK, 0 rows affected (0.01 sec)
> create table test_char2(v varchar(65535)) charset=latin1;
ERROR
1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs而對於utf8還是有很大的差別,對應的是3個位元組,所以需要除以3,按照(65535-2)/3,最大值就是21844了。
> create table test_char2(v varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.00 sec)
> create table test_char3(v varchar(21845)) charset=utf8;
ERROR
1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs上面的場景相對來說會有一些侷限性,那麼我們引入表結構的設計。
如果是gbk字符集,含有下面的幾個欄位,則memo欄位的varchar型別最大長度是多少?
> create table test_char3(id int,name varchar(20),memo varchar(32766)) charset=gbk;
ERROR
1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs
這個問題還是如法炮製,應用之前的計算方式,數值型是4個位元組,字元型乘以2,含有字元型的長度小於255,所以減去1即可,這樣下來就是(65535-1-4-20*2-2)約等於32743
> create table test_char3(id int,name varchar(20),memo varchar(32744)) charset=gbk;
ERROR
1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOB兩種測試結果可以簡單對比一下。
> create table test_char3(id int,name varchar(20),memo varchar(32743)) charset=gbk;
Query OK, 0 rows affected (0.01 sec)
select (65535-1-4-20*2-2)/2;
+----------------------+
| (65535-1-4-20*2-2)/2 |
+----------------------+
| 32744.0000 |
+----------------------+
1 row in set (0.00 sec)
整個過程還是需要考慮到這些點的,否則前期不夠重視,在後面去做擴充套件的時候就會有很大的限制。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2141361/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 大欄位問題MySql
- MySQL的欄位數量以及長度限制MySql
- [BUG反饋]username欄位的長度設定有點小問題。
- mysql的varchar欄位最大長度真的是65535嗎?MySql
- 欄位長度前後端是否都需要做限制?後端
- MySQL中修改一個資料庫下包含有某個相同欄位的所有表的欄位長度MySql資料庫
- oracle 修改表欄位的長度Oracle
- vue中需要注意的問題總結(上)Vue
- 關於32位程式在64位系統下執行中需要注意的重定向問題
- [20180613]縮短欄位長度.txt
- 使用 sendBeacon 需要注意的問題
- MySQL 中 JSON 欄位的使用技巧MySqlJSON
- MySQL中JSON欄位的使用技巧MySqlJSON
- [20231020]增加欄位的問題.txt
- 使用mysql-connect-java-8.0.11驅動包需要注意的問題MySqlJava
- Oracle 修改欄位型別和長度Oracle型別
- 10個需要注意的SQL問題SQL
- [20210423]建立檢視以及欄位長度.txt
- 安裝rac時需要注意的問題
- Oracle remap_schema需要注意的問題OracleREM
- Python初學者需要注意的問題Python
- MySQL 5.6使用pt-online-schema-change線上修改大表欄位長度MySql
- 網路爬蟲設計中需要注意的幾個問題爬蟲
- MySQL欄位究竟是否需要設定成not nullMySqlNull
- 教育直播系統搭建需要注意的問題
- 運用mysqldump 工具時需要注意的問題MySql
- app開發需要注意哪些問題APP
- 資料治理需要注意哪些問題
- [轉載] 詳解 MySQL int 型別的長度值問題MySql型別
- 【轉載】詳解 MySQL int 型別的長度值問題MySql型別
- 在使用mybatis的請務必注意欄位的大小寫問題,insert時務必注意mapper的返回值型別MyBatisAPP型別
- [20210208]lob欄位與查詢的問題.txt
- 記錄一次因 mysql 欄位取名不規範導致的問題MySql
- ORANCLE 資料已存在,修改欄位型別長度型別
- MySql 查詢某一天日期格式欄位走索引問題MySql索引
- map判斷值是否存在需要注意的問題
- visual studio建立專案時需要注意的問題
- 使用 foreach 使用引用變數需要注意的問題變數
- 電磁流量計在使用需要注意的問題