MySql中 char vs varchar vs nvarchar

一、char和varchar的區別
char是固定長度的,而varchar會根據具體的長度來使用存儲空間,另外varchar需要用額外的1-2個字節存儲字符串長度。
1). 當字符串長度小於255時,用額外的1個字節來記錄長度
2). 當字符串長度大於255時,用額外的2個字節來記錄長度
比如char(255)和varchar(255),在存儲字符串"hello world"時,char會用一塊255個字節的空間放那個11個字符;而varchar就不會用255個,它先計算字符串長度爲11,然後再加上一個記錄字符串長度的字節,一共用12個字節存儲,這樣varchar在存儲不確定長度的字符串時會大大減少存儲空間。

二、varchar和nvarchar的區別
1. varchar(n):長度爲n個字節的可變長度且非Unicode的字符數據。n必須是一個介於1和8,000之間的數值。存儲大小爲輸入數據的字節的實際長度

2. nvarchar(n):包含n個字符的可變長度Unicode字符數據。n的值必須介於1與4,000之間。字節的存儲大小是所輸入字符個數的兩倍。所輸入的數據字符長度可以爲零。

三、char和varchar的使用場景
1. 從字符長度的角度考慮:
(1). 長度較短的字段,使用char。如門牌號:101,201,...
(2). 固定長度的字段,使用char。如性別、身份證號、手機號等。(因爲數據都是固定長度,varchar根據長度動態存儲的特性就沒作用了,而且還要佔一個字節來存儲長度)
(3). 字段的長度是否相近,如果某個字段其長度雖然比較長,但是其長度總是近似的,如一般在90個到100個字符之間,甚至是相同的長度。此時比較適合採用CHAR字符類型。

2. 從碎片角度考慮:
使用CHAR時,由於存儲空間都是一次性分配的。從這個角度來講,不存在碎片的困擾。而使用varchar時,因爲存儲的長度是可變的,當數據長度在更改前後不一致時,就不可避免地會出現碎片的問題。故使用varchar時,數據庫管理員要時不時的對碎片進行整理。如執行數據庫導出導入作業來消除碎片。

3. 即使使用Varchar數據類型,也不能夠太過於慷慨。
雖然varchar可以自動根據長度調整存儲空間,但是varchar(100)和varchar(255)還是有區別的:
假設它們都存儲了90個字符的數據,那麼它們在磁盤上的存儲空間是相同的(硬盤上的存儲空間是根據實際字符長度來分配存儲空間的)。但對於內存來說,則不是這樣的,內存是使用varchar中定義的長度(這裏爲100或255)的內存塊來保存值。
所以如果某些字段會涉及到文件排序或者基於磁盤的臨時表時,分配VARCHAR的長度時仍然不能過於慷慨,需要評估實際需要的長度,然後設置一個合適的長度,不能隨意設置長度。

四、varchar和nvarchar的使用場景
1. nvarchar適用中文和其他字符,其中N表示Unicode編碼,可以解決多語言之間的轉換問題

轉載https://www.cnblogs.com/zeroingToOne/p/9568687.html

另見 https://www.jb51.net/article/55366.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章