char、varchar、varchar2區別

char varchar varchar2 的區別 
區別:
1.CHAR的長度是固定的,而VARCHAR2的長度是可以變化的, 比如,存儲字符串“abc",對於CHAR (20),表示你存儲的字符將佔20個字節(包括17個空字符),而同樣的VARCHAR2 (20)則只佔用3個字節的長度,20只是最大值,當你存儲的字符小於20時,按實際長度存儲。 
2.CHAR的效率比VARCHAR2的效率稍高。 
3.目前VARCHAR是VARCHAR2的同義詞。工業標準的VARCHAR類型可以存儲空字符串,但是oracle不這樣做,儘管它保留以後這樣做的權利。Oracle自己開發了一個數據類型VARCHAR2,這個類型不是一個標準的VARCHAR,它將在數據庫中varchar列可以存儲空字符串的特性改爲存儲NULL值。如果你想有向後兼容的能力,Oracle建議使用VARCHAR2而不是VARCHAR。

何時該用CHAR,何時該用varchar2? 
CHAR與VARCHAR2是一對矛盾的統一體,兩者是互補的關係. 
VARCHAR2比CHAR節省空間,在效率上比CHAR會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在數據庫設計上常說的‘以空間換效率’。 
VARCHAR2雖然比CHAR節省空間,但是如果一個VARCHAR2列經常被修改,而且每次被修改的數據的長度不同,這會引起‘行遷移’(Row Migration)現象,而這造成多餘的I/O,是數據庫設計和調整中要盡力避免的,在這種情況下用CHAR代替VARCHAR2會更好一些。

char varchar nchar nvarchar 四者的區別
1、char[(n)]

長度爲 n 個字節的固定長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小爲 n 個字節。char 在 SQL-92 中的同義詞爲 character。

2、varchar[(n)]


長度爲 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節。所輸入的數據字符長度可以爲零。varchar 在 SQL-92 中的同義詞爲 char varying 或 character varying。


如果沒有在數據定義或變量聲明語句中指定 n,則默認長度爲 1。如果沒有使用 CAST 函數指定 n,則默認長度爲 30。


將爲使用 char 或 varchar 的對象被指派數據庫的默認排序規則,除非用 COLLATE 子句另外指派了特定的排序規則。該排序規則控制用於存儲字符數據的代碼頁。


支持多語言的站點應考慮使用 Unicode nchar 或 nvarchar 數據類型以儘量減少字符轉換問題。如果使用 char 或 varchar: 


如果希望列中的數據值大小接近一致,請使用 char。




如果希望列中的數據值大小顯著不同,請使用 varchar。 
如果執行 CREATE TABLE 或 ALTER TABLE 時 SET ANSI_PADDING 爲 OFF,則一個定義爲 NULL 的 char 列將被作爲 varchar 處理。 


當排序規則代碼頁使用雙字節字符時,存儲大小仍然爲 n 個字節。根據字符串的不同,n 個字節的存儲大小可能小於 n 個字符。

nchar 是固定長度 Unicode 數據的數據類型,nvarchar 是可變長度 Unicode 數據的數據類型,二者均使用 UNICODE UCS-2 字符集。
3、nchar(n)

包含 n 個字符的固定長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。存儲大小爲 n 字節的兩倍。nchar 在 SQL-92 中的同義詞爲 national char 和 national character。

3、nvarchar(n)

包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。所輸入的數據字符長度可以爲零。nvarchar 在 SQL-92 中的同義詞爲 national char varying 和 national character varying。

如果沒有在數據定義或變量聲明語句中指定 n,則默認長度爲 1。如果沒有使用 CAST 函數指定 n,則默認長度爲 30。


如果希望列中所有數據項的大小接近一致,則使用 nchar。


如果希望列中數據項的大小差異很大,則使用 nvarchar。


使用 nchar 或 nvarchar 的對象被賦予數據庫的默認排序規則,除非使用 COLLATE 子句賦予特定的排序規則。


SET ANSI_PADDING OFF 不適用於 nchar 或 nvarchar。SET ANSI_PADDING ON 永遠適用於 nchar 和 nvarchar。


===========================================================================

nchar(n)     


    包含     n     個字符的固定長度     Unicode     字符數據。n     的值必須介於     1     與     4,000     之間。存儲大小爲     n     字節的兩倍。nchar     在     SQL-92     中的同義詞爲     national     char     和     national     character。    


    nvarchar(n)    


    包含     n     個字符的可變長度     Unicode     字符數據。n     的值必須介於     1     與     4,000     之間。字節的存儲大小是所輸入字符個數的兩倍。所輸入的數據字符長度可以爲零。nvarchar     在     SQL-92     中的同義詞爲     national     char     varying     和     national     character     varying。   


    註釋  


    如果沒有在數據定義或變量聲明語句中指定     n,則默認長度爲     1。如果沒有使用     CAST     函數指定     n,則默認長度爲     30。    


    如果希望列中所有數據項的大小接近一致,則使用     nchar。    


    如果希望列中數據項的大小差異很大,則使用     nvarchar。    


    使用     nchar     或     nvarchar     的對象被賦予數據庫的默認排序規則,除非使用     COLLATE     子句賦予特定的排序規則。    


    SET     ANSI_PADDING     OFF     不適用於     nchar     或     nvarchar。SET     ANSI_PADDING     ON     永遠適用於     nchar     和     nvarchar。   
   二、char     和     varchar  
    固定長度     (char)     或可變長度     (varchar)     字符數據類型。    

    char[(n)]    


    長度爲     n     個字節的固定長度且非     Unicode     的字符數據。n     必須是一個介於     1     和     8,000     之間的數值。存儲大小爲     n     個字節。char     在     SQL-92     中的同義詞爲     character。     

    varchar[(n)]  
    長度爲     n     個字節的可變長度且非     Unicode     的字符數據。n     必須是一個介於     1     和     8,000     之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是     n     個字節。所輸入的數據字符長度可以爲零。varchar     在     SQL-92     中的同義詞爲     char     varying     或     character     varying。  
    註釋  
    如果沒有在數據定義或變量聲明語句中指定     n,則默認長度爲     1。如果沒有使用     CAST     函數指定     n,則默認長度爲     30。  

    將爲使用     char     或     varchar     的對象被指派數據庫的默認排序規則,除非用     COLLATE     子句另外指派了特定的排序規則。該排序規則控制用於存儲字符數據的代碼頁。    

    支持多語言的站點應考慮使用     Unicode     nchar     或     nvarchar     數據類型以儘量減少字符轉換問題。如果使用     char     或     varchar:      

    如果希望列中的數據值大小接近一致,請使用     char。   

    如果希望列中的數據值大小顯著不同,請使用     varchar。    


    如果執行     CREATE     TABLE     或     ALTER     TABLE     時     SET     ANSI_PADDING     爲     OFF,則一個定義爲     NULL     的     char     列將被作爲     varchar     處理。

    當排序規則代碼頁使用雙字節字符時,存儲大小仍然爲     n     個字節。根據字符串的不同,n     個字節的存儲大小可能小於     n     個字符。  


總結:
   1、 varchar:  
              可變長度的非    Unicode   數據,最長爲    8,000    個字符。  
   2、nvarchar:  
              可變長度    Unicode    數據,其最大長度爲    4,000    字符。  
   3、char:
          固定長度的非 Unicode 字符數據,最大長度爲 8,000 個字符。
   4、nchar
         固定長度的 Unicode 數據,最大長度爲 4,000 個字符。

    5、     char和varchar都是字符串類型的

        用Unicode編碼的字符串,結果是字符的整數值


================================================================================================================================

char是定長的,varchar是變長的。

varchar2應該是varchar的升級,似乎只有ORACLE纔有,這裏不作討論。

char定長存儲,速度快,但是存在一定的空間浪費,適用於字段不是很大,對速度要求高的場合。速度快是因爲其在物理上是按定長存儲的,這樣,就可以根據偏移址一次取出固定長度的字符。

varchar變長存儲,所以效率不如char。varchar在存儲時,在物理上要先存儲該字段的實際長度,然後纔是內容。這樣讀取的時候,就要讀取兩次,一次讀它的長度,然後纔是內容。所以它的訪問速度會比char慢一些。但它可以節省空間。 

由於mysql自身的特點,如果一個數據表存在varchar字段,則表中的char字段將自動轉爲varchar字段。在這種情況下設置的char是沒有意義的。所以要想利用char的高效率,要保證該表中不存在varchar字段;否則,應該設爲varchar字段。

 

SQL中char、varchar、text和nchar、nvarchar、ntext的區別
1、CHAR。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間。
2、VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過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類型的字段時 char、nchar、varchar、nvarchar、text、ntext中哪一種呢?

 

數據庫定義到char類型的字段時,不知道大家是否會猶豫一下,到底選char、nchar、varchar、nvarchar、text、ntext中哪一種呢?結果很可能是兩種,一種是節儉人士的選擇:最好是用定長的,感覺比變長能省些空間,而且處理起來會快些,無法定長只好選用定長,並且將長度設置儘可能地小;另一種是則是覺得無所謂,儘量用可變類型的,長度儘量放大些。
鑑於現在硬件像蘿蔔一樣便宜的大好形勢,糾纏這樣的小問題實在是沒多大意義,不過如果不弄清它,總覺得對不起勞累過度的CPU和硬盤。

下面開始了(以下說明只針對SqlServer有效):
1、當使用非unicode時慎用以下這種查詢:
select f from t where f = N'xx'
原因:無法利用到索引,因爲數據庫會將f先轉換到unicode再和N'xx'比較
2、char 和相同長度的varchar處理速度差不多(後面還有說明)
3、varchar的長度不會影響處理速度!!!(看後面解釋)
4、索引中列總長度最多支持總爲900字節,所以長度大於900的varchar、char和大於450的nvarchar,nchar將無法創建索引
5、text、ntext上是無法創建索引的
6、O/R Mapping中對應實體的屬性類型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性來說,可變長度的類型更加吻合
7、一般基礎資料表中的name在實際查詢中基本上全部是使用like '%xx%'這種方式,而這種方式是無法利用索引的,所以如果對於此種字段,索引建了也白建
8、其它一些像remark的字段則是根本不需要查詢的,所以不需要索引
9、varchar的存放和string是一樣原理的,即length {block}這種方式,所以varchar的長度和它實際佔用空間是無關的
10、對於固定長度的字段,是需要額外空間來存放NULL標識的,所以如果一個char字段中出現非常多的NULL,那麼很不幸,你的佔用空間比沒有NULL的大(但這個大並不是大太多,因爲NULL標識是用bit存放的,可是如果你一行中只有你一個NULL需要標識,那麼你就白白浪費1byte空間了,罪過罪過!),這時候,你可以使用特殊標識來存放,如:'NV'
11、同上,所以對於這種NULL查詢,索引是無法生效的,假如你使用了NULL標識替代的話,那麼恭喜你,你可以利用到索引了
12、char和varchar的比較成本是一樣的,現在關鍵就看它們的索引查找的成本了,因爲查找策略都一樣,因此應該比較誰佔用空間小。在存放相同數量的字符情況下,如果數量小,那麼char佔用長度是小於varchar的,但如果數量稍大,則varchar完全可能小於char,而且要看實際填充數值的充實度,比如說varchar(3)和char(3),那麼理論上應該是char快了,但如果是char(10)和varchar(10),充實度只有30%的情況下,理論上就應該是varchar快了。因爲varchar需要額外空間存放塊長度,所以只要length(1-fillfactor)大於這個存放空間(好像是2字節),那麼它就會比相同長度的char快了。
13、nvarchar比varchar要慢上一些,而且對於非unicode字符它會佔用雙倍的空間,那麼這麼一種類型推出來是爲什麼呢?對,就是爲了國際化,對於unicode類型的數據,排序規則對它們是不起作用的,而非unicode字符在處理不同語言的數據時,必須指定排序規則才能正常工作,所以n類型就這麼一點好處。


總結:
1、如果數據量非常大,又能100%確定長度且保存只是ansi字符,那麼char
2、能確定長度又不一定是ansi字符或者,那麼用nchar;
3、不確定長度,要查詢且希望利用索引的話,用nvarchar類型吧,將它們設到400;
4、不查詢的話沒什麼好說的,用nvarchar(4000)
5、性格豪爽的可以只用3和4,偶爾用用1,畢竟這是一種額外說明,等於告訴別人說,我一定需要長度爲X位的數據

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