亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

MySQL中需要注意的字段長度問題

發布時間:2020-08-16 22:34:57 來源:ITPUB博客 閱讀:254 作者:jeanron100 欄目: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)


整個過程還是需要考慮到這些點的,否則前期不夠重視,在后面去做擴展的時候就會有很大的限制。

向AI問一下細節

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

AI

崇文区| 阿鲁科尔沁旗| 孟连| 靖远县| 巴东县| 新巴尔虎右旗| 望城县| 漳平市| 阿坝县| 牡丹江市| 皋兰县| 雷州市| 噶尔县| 新巴尔虎左旗| 原平市| 平南县| 璧山县| 南充市| 屯留县| 山西省| 陈巴尔虎旗| 咸宁市| 米易县| 高州市| 尉氏县| 金乡县| 临安市| 高尔夫| 大关县| 建阳市| 丰镇市| 崇州市| 屯留县| 石门县| 沽源县| 饶平县| 阳城县| 洛阳市| 茶陵县| 华池县| 阿尔山市|