1. 程式人生 > >Oracle 編碼格式 及其 char Varchar Varchar2的區別

Oracle 編碼格式 及其 char Varchar Varchar2的區別

select value from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';

NLS_CHARACTERSET(“字符集”)定義了“普通”的 CHAR, VARCHAR2, LONG 以及 CLOB 欄位的編碼。

NLS_NCHAR_CHARACTERSET(“國家字符集”)定義了 NCHAR, NVARCHAR2 以及 NCLOB 欄位的編碼。從 9i 以後都是 Unicode 編碼。如果沒有使用 NCHAR, NVARCHAR2 以及 NCLOB 欄位,那麼 NLS_NCHAR_CHARACTERSET 的設定不會被使用或者說不相關。

注意:資料庫的NLS_CHARACTERSET 為AL32UTF8,即一個漢字佔用三到四個位元組。如果NLS_CHARACTERSET為ZHS16GBK,則一個字元佔用兩個位元組。

一 varchar,varchar2,nvarchar,nvarchar2 
四個型別都屬於變長字元型別, varchar和varchar2的區別在與後者把所有字元都佔兩位元組,前者只對漢字和全形等字元佔兩位元組,都是非 Unicode 字元資料,可以定義的最大長度為4000位元組。 nvarchar和nvarchar2的區別和上面一樣,   與上面區別在於是根據Unicode   標準所進行的定義的型別(長度定義的是字元數,而不是位元組數),通常用於支援多國語言類似系統的定義,可以定義的最大長度為4000字元、8000位元組。 

1.char 

char的長度是固定的,比如說,你定義了char(20),即使你你插入abc,不足二十個位元組,資料庫也會在abc後面自動加上17個空格,以補足二十個位元組; 

char是區分中英文的,中文在char中佔兩個位元組,而英文佔一個,所以char(20)你只能存20個字母或10個漢字。 

char適用於長度比較固定的,一般不含中文的情況 

2.varchar/varchar2 

varchar是長度不固定的,比如說,你定義了varchar(20),當你插入abc,則在資料庫中只佔3個位元組。 

varchar同樣區分中英文,這點同char。 

varchar2基本上等同於varchar,它是oracle自己定義的一個非工業標準varchar,不同在於,varchar2用null代替varchar的空字串 

varchar/varchar2適用於長度不固定的,一般不含中文的情況 

3.nvarchar/nvarchar2 

nvarchar和nvarchar2是長度不固定的,不區分中英文,其長度定義的是字元數
nvarchar不區分中英文,比如說:你定義了nvarchar(20),你可以存入20個英文字母/漢字或中英文組合,這個20定義的是字元數而不是位元組數 

nvarchar2基本上等同於nvarchar,不同在於nvarchar2中存的英文字母也佔兩個位元組 

nvarchar/nvarchar2適用於存放中文

1.NULL值(空值)。 

     a. char列的NULL值佔用儲存空間。char型別可以定義空字串

     b. varcahr列的NULL值不佔用儲存空間。varchar型別定義的空字串按照null進行處理

c. 插入同樣數量的NULL值,varchar列的插入效率明顯高出char列。 
2.插入資料 

    無論插入資料涉及的列是否建立索引,char的效率都明顯低於varchar。 

3. 更新資料 

     如果更新的列上未建立索引,則char的效率低於varchar,差異不大;建立索引的話,效率較高。 

4. 修改結構 

     a. 無論增加或是刪除的列的型別是char還是varchar,操作都能較快的完成,而且效率上沒有什麼差異。 

     b. 對於增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費時間,而修改char列需要花費很長的時間。 

5.資料檢索 

     無論是否通過索引,varchar型別的資料檢索略優於char的掃描。 

選擇char還是選擇varchar的建議 

    1.適宜於char的情況: 

     a. 列中的各行資料長度基本一致,長度變化不超過50位元組; 

     b. 資料變更頻繁,資料檢索的需求較少。 

     c. 列的長度不會變化,修改char型別列的寬度的代價比較大。 

     d. 列中不會出現大量的NULL值。 

     e. 列上不需要建立過多的索引,過多的索引對char列的資料變更影響較大。 

    2.適宜於varchar的情況; 

     a. 列中的各行資料的長度差異比較大。 

     b. 列中資料的更新非常少,但查詢非常頻繁。 
     c. 列中經常沒有資料,為NULL值或為空值

佔用長度的比較:

1.CHAR(size)和VARCHAR(size)的區別 
    CHAR為定長的欄位,最大長度為2K位元組; 
    VARCHAR為可變長的欄位,最大長度為4K位元組; 

2.CHAR(size)和NCHAR(size)的區別 
    CHAR如果存放字母數字佔1個位元組,存放GBK編碼的漢字存放2個位元組,存放UTF-8編碼的漢字佔用3個位元組; 
    NCHAR根據所選字符集來定義存放字元的佔用位元組數,一般都為2個位元組存放一個字元(不管字元或者漢字) 

3.VARCHAR(size)和VARCHAR2(size)的區別 
  後者把所有字元都佔兩位元組,前者只對漢字和全形等字元佔兩位元組,如果存放的字元為中英文結合的資料,那麼存放的字元個數不同,varchar多於varchar2;佔用的最大長度為4K位元組;推薦使用VARCHAR2; 

4.VARCHAR2(size)和NVARCHAR2(size)的區別 
   後者把所有字元都佔兩位元組,前者只對漢字和全形等字元佔兩位元組;(如果資料庫字符集長度是2,則NVARCHAR2最大為2K)

由於定義長度是字元數,nvarchar和nvarchar2定義相同的長度,如果資料既有中文又有英文和數字,則nvarchar佔用的儲存空間小於nvarchar2