1、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在存儲不肯定長度的字符串時會大大減小存儲空間。 數據庫
2、varchar和nvarchar的區別
1. varchar(n):長度爲n個字節的可變長度且非Unicode的字符數據。n必須是一個介於1和8,000之間的數值。存儲大小爲輸入數據的字節的實際長度編碼
2. nvarchar(n):包含n個字符的可變長度Unicode字符數據。n的值必須介於1與4,000之間。字節的存儲大小是所輸入字符個數的兩倍。所輸入的數據字符長度能夠爲零。spa
3、char和varchar的使用場景
1. 從字符長度的角度考慮:
(1). 長度較短的字段,使用char。如門牌號:101,201,...
(2). 固定長度的字段,使用char。如性別、身份證號、手機號等。(由於數據都是固定長度,varchar根據長度動態存儲的特性就沒做用了,並且還要佔一個字節來存儲長度)
(3). 字段的長度是否相近,若是某個字段其長度雖然比較長,可是其長度老是近似的,如通常在90個到100個字符之間,甚至是相同的長度。此時比較適合採用CHAR字符類型。.net
2. 從碎片角度考慮:
使用CHAR時,因爲存儲空間都是一次性分配的。從這個角度來說,不存在碎片的困擾。而使用varchar時,由於存儲的長度是可變的,當數據長度在更改先後不一致時,就不可避免地會出現碎片的問題。故使用varchar時,數據庫管理員要時不時的對碎片進行整理。如執行數據庫導出導入做業來消除碎片。code
3. 即便使用Varchar數據類型,也不可以太過於慷慨。
雖然varchar能夠自動根據長度調整存儲空間,可是varchar(100)和varchar(255)仍是有區別的:
假設它們都存儲了90個字符的數據,那麼它們在磁盤上的存儲空間是相同的(硬盤上的存儲空間是根據實際字符長度來分配存儲空間的)。但對於內存來講,則不是這樣的,內存是使用varchar中定義的長度(這裏爲100或255)的內存塊來保存值。
因此若是某些字段會涉及到文件排序或者基於磁盤的臨時表時,分配VARCHAR的長度時仍然不能過於慷慨,須要評估實際須要的長度,而後設置一個合適的長度,不能隨意設置長度。htm
4、varchar和nvarchar的使用場景
1. nvarchar適用中文和其餘字符,其中N表示Unicode編碼,能夠解決多語言之間的轉換問題排序