2017年4月15日 星期六

資料庫中CHAR,VARCHAR,VARCHAR2,NVARCHAR,NVARCHAR2類型的區別與使用

varchar,nvarchar, varchar2,nvarchar2的區別
四個類型都屬於變長字符類型, varchar和varchar2的區別在與後者把所有字符都占兩字節,前者只對漢字和全角等字符占兩字節。 nvarchar和nvarchar2的區別和上面一樣, 與上面區別在於是根據Unicode 標準所進行的定義的類型,通常用於支持多國語言類似系統的定義。
varchar2,nvarchar2為oracle自行定義

ORACLE
1.char
char的長度是固定的,比如說,你定義了char(20),即使你你插入abc,不足二十個字節,資料庫也會在abc後面自動加上17個空格,以補足二十個字節;
char是區分中英文的,中文在char中占兩個字節,而英文占一個,所以char(20)你只能存20個字母或10個漢字。
char適用於長度比較固定的,一般不含中文的情況
以"123號"為例,length為9,lengthb則為10

2.varchar/varchar2
varchar是長度不固定的,比如說,你定義了varchar(20),當你插入abc,則在資料庫中只占3個字節。
varchar同樣區分中英文,這點同char。
varchar2基本上等同於varchar,它是oracle自己定義的一個非工業標準varchar,不同在於,varchar2用null代替varchar的空字符串
varchar/varchar2適用於長度不固定的,一般不含中文的情況
(1)varchar2把所有字符都占兩字節(Byte)處理(一般情況下),varchar只對漢字和全角等字符占兩字節,數字,英文字符等都是一個字節;(以oracle實測,英數字只佔1 Byte)
(2)VARCHAR2把空串等同於null處理,而varchar仍按照空串處理; 
(3)VARCHAR2字符要用幾個字節存儲,要看資料庫使用的字符集, 大部分情況下建議使用varchar2類型,可以保證更好的兼容性。
以"123號"為例,varchar2,length為4,lengthb則為5

3.nvarchar/nvarchar2
nvarchar和nvarchar2是長度不固定的
nvarchar不區分中英文,比如說:你定義了nvarchar(20),你可以存入20個英文字母/漢字或中英文組合,這個20定義的是字符數(Bit)而不是字節數(Byte)
nvarchar2基本上等同於nvarchar,不同在於nvarchar2中存的英文字母也占兩個字節
nvarchar/nvarchar2適用於存放中文
以"123號"為例,nvarchar2,length為4,lengthb則為8
PS:nchar/nvarchar2是專為unicode而設計的, 而每個字符佔多少個byte, 便要看Oracle的national characterset使用那一個字集而定

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

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

PS:資料庫儲存引擎對不同的資料型態有不同的對待方式,固定長度欄位直接搜尋分頁指標位置取出資料,可變長度欄位會先算資料實際長度再進入分頁取資料,速度本來就會比固定長度慢一些,用 max 方式宣告的話,儲存引擎會將它視為 LOB 資料型態,會將它儲存到額外的分頁內,光是在磁碟中搜尋這些分頁的成本會比計算長度更高 (別忘了這是 I/O 動作),會使得查詢和寫入速度都變慢。資料少量時看不出來,等量很大時就準備哭哭吧。

MySQL

char是定長的,varchar是變長的。varchar2應該是varchar的升級,似乎只有ORACLE才有,這裡不作討論。

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

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

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

原文網址:https://read01.com/QExoxE.html

沒有留言:

張貼留言