一、第一種
char(n)和varchar(n)的區別:
在這里我們可以清楚的看到他們表面的區別就是前面是否有var,在這里解釋一下var是什么意思,var代表“可變的”的意思
下面看個例子:
char(4)//char代表的是字符的意思,這在Java中學過,一個漢字代表一個字符,2個字節;一個英文代表一個字符,一個字節。而這里char(n),(除了它,其余三個都是如此)n是代表字節數,現在我們假如存儲‘abcd’(4個字節,所以可以存儲),再假如存儲‘中國你好’(8個字節,所以不能存儲),再假如存儲‘ab’(由於是有四個字節,而現在ab只占兩個字節,所以用兩個空格補上后面的兩個字節,所以數據庫的數據為‘ab ’) varchar(4)//同樣我們以上面的例子舉例,假如存儲‘abcd’(4個字節,所以可以存儲),再假如存儲‘中國你好’(8個字節,所以不能存儲),再假如存儲‘ab’(由於是有四個字節,而現在ab只占兩個字節,然而varchar(n)是由var開頭的,數據是可變的,所以不用像char(4),用空格補字節的方法,而是可以直接省略空格,所以數據庫的數據還是‘ab’)
nchar(n)和nvarchar(n)
同樣我們先弄清楚以n開頭的數據類型是什么意思,已n開頭表示此字符是unicode編碼的格式,不是以n開頭的自然不是unicode編碼格式。我們在前面說過,括號里面的n是代表字節數,而在這里,由於是unicode編碼格式,所以n代表2n個字節數,同樣以上面的例子舉例:
nchar(4)//既然是unicode編碼格式並且不是可變的,所以總共可以存儲2*4=8個字節,我們現在假如存儲‘abcd’(由於是只占四個字節,所以在數據庫中的數據為‘abcd ’),假如存儲‘中國你好’(則完全可以存放) nvarchar(4)//既然是unicode編碼且為可變的,所以存儲‘abcd’(在數據庫中的數據為‘abcd’,不會再補空格)
最后,總結一下,var代表可變的,n開頭代表是unicode編碼。
二、第二種
1、char:
固定長度的非Unicode字符數據,最大長度為8000個字符。
2、varchar:
可變長度的非Unicode數據,最長為8000個字符。
3、nvarchar:
可變長度Unicode數據,其最大長度為4000字符。
4、nchar:
固定長度的Unicode數據,最大長度為4000個字符。
5、char和varchar都是字符串類型的:
用Unicode編碼的字符串,結果是字符的整數值
用法區別:
文字字段若長度固定,如:身分證號碼,就不要用varchar或nvarchar,應該用char或nchar。
支持多語言的站點應考慮使用Unicode nchar或nvarchar數據類型以盡量減少字符轉換問題
文字字段若長度不固定,如:地址,則該用varchar或nvarchar。除了可節省存儲空間外,存取硬盤時也會較有效率。
第三種:
1、char。char存儲定長數據很方便,char字段上的索引效率級高,比如定義char(10),那么不論你存儲的數據是否達到了10個字節,都要占去10個字節的空間,不足的自動用空格填充,所以在讀取的時候可能要多次用到trim()。
2、varchar。存儲變長數據,但存儲效率沒有cahr高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義varchar(10)是最合算的。varchar類型的實際長度是它的值的實際長度+1。為什么“+1”呢?這一個字節用於保存實際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
3、text。text存儲可變長度的非Unicode數據,最大長度為2^31-1(2,147,483,647)個字符。
4、nchar、nvarchar、ntext。這三種從名字上看比前面三種多了個“n”。它表示存儲的是Unicode數據類型的字符。我們知道字符中,英文字符只需要一個字節存儲就足夠了,但漢字眾多,需要兩個字節存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲4000個字符,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。可以看出使用nchar、nvarchar數據類型時不用擔心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數量上有些損失。
所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數字,用char/varchar
我把他們的區別概括成:
char,nchar定長,速度快,占空間大,需處理
varchar,nvarchar,text不定長,空間小,速度慢,無需處理
nchar、nvarchar、ntext處理Unicode碼
參考:
http://blog.csdn.net/IUNIQUE/article/details/52902033(以上內容部分轉自此篇文章)
http://blog.csdn.net/ivanluc/article/details/5174536(以上內容部分轉自此篇文章)
http://www.jb51.net/article/37995.htm(以上內容部分轉自此篇文章)
