MySQL中數據類型(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)(轉)


一、第一種

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(以上內容部分轉自此篇文章)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM