1. 程式人生 > >Oracle中varchar與varchar2

Oracle中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會更好一些。

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

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適用於存放中文 

char [ ( n ) ] 

    固定長度,非 Unicode 字元資料,長度為 n 個位元組。n 的取值範圍為 1 至 8,000,儲存大小是 n 個位元組。 

varchar [ ( n | max ) ] 

    可變長度,非 Unicode 字元資料。n 的取值範圍為 1 至 8,000。max 指示最大儲存大小是 2^31-1 個位元組。儲存大小是輸入資料的實際長度加 2 個位元組,用於反映儲存的資料的長度。所輸入資料的長度可以為 0 個字元。 

    * 如果列資料項的大小一致,則使用 char。 
    * 如果列資料項的大小差異相當大,則使用 varchar。 
    * 如果列資料項大小相差很大,而且大小可能超過 8,000 位元組,請使用 varchar(max)。 

如果未在資料定義或變數宣告語句中char 或 varchar 資料型別指定 n,則預設長度為 1。如果在使用 CAST 和 CONVERT 函式時char 或 varchar 資料型別未指定 n,則預設長度為 30。 
當執行 CREATE TABLE 或 ALTER TABLE 時,如果 SET ANSI_PADDING 為 OFF,則定義為 NULL 的 char 列將作為 varchar 處理。 
另外幫助理解的,只供參考:轉自http://www.51testing.com/?uid-258885-action-viewspace-itemid-141197 
也可參照學習http://ce.sysu.edu.cn/garden/dispbbs.asp?boardid=26&ID=8774&replyID=18180&skin=1 
1.NULL值(空值)。 

     a. char列的NULL值佔用儲存空間。 

     b. varcahr列的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值或為空值 

nchar [ ( n ) ] 

    n 個字元的固定長度的 Unicode 字元資料。n 值必須在 1 到 4,000 之間(含)。儲存大小為兩倍 n 位元組。 

nvarchar [ ( n | max ) ] 

    可變長度 Unicode 字元資料。n 值在 1 到 4,000 之間(含)。max 指示最大儲存大小為 2^31-1 位元組。儲存大小是所輸入字元個數的兩倍 + 2 個位元組。所輸入資料的長度可以為 0 個字元。 

註釋 

如果沒有在資料定義或變數宣告語句中指定 n,則預設長度為 1。如果沒有使用 CAST 函式指定 n,則預設長度為 30。 

如果列資料項的大小可能相同,請使用 nchar。 

如果列資料項的大小可能差異很大,請使用 nvarchar。 

sysname 是系統提供的使用者定義資料型別,除了不可為空值外,在功能上與 nvarchar(128) 相同。sysname 用於引用資料庫物件名。 

為使用 nchar 或 nvarchar 的物件分配的是預設的資料庫排序規則,但可使用 COLLATE 子句分配特定的排序規則。 

SET ANSI_PADDING ON 永遠適用於 nchar 和 nvarchar。SET ANSI_PADDING OFF 不適用於 nchar 或 nvarchar 資料型別。 

在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2這五種型別的區別 

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)的區別 
    在現在的版本中,兩者是沒有區別的;最大長度為4K位元組;推薦使用VARCHAR2; 

4.VARCHAR2(size)和NVARCHAR2(size)的區別 
    最大長度為4K位元組,區別同CHAR與NCHAR的區別;(如果資料庫字符集長度是2,則NVARCHAR2最大為2K)

5.共同特性 
    當執行insert的時候,插入的值為'',則轉變成null,即insert ... values('') <=> insert ... values(null) 
    搜尋的條件須用where xx is null 

6.例子 
    比如有一個性別字段,裡面存放“男,女”的其中一個值,兩種常用選擇 
        CHAR(2)    和 NCHAR(1)    

--varchar,varchar2

聯絡:
1.varchar/varchar2用於儲存可變長度的字串
比如varchar(20),存入字串'abc',則資料庫中該欄位只佔3個位元組,而不是20個位元組
2.size 的最大值是 4000,而最小值是 1,其值表示位元組數,比如
varchar(20)表示最大可以存放20個位元組的內容

區別:
1.varchar2把所有字元都佔兩位元組處理(一般情況下),varchar只對漢字和全形等字元佔兩位元組,數字,英文字元等都是一個位元組;
2.VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;
3.VARCHAR2字元要用幾個位元組儲存,要看資料庫使用的字符集,
比如GBK,漢字就會佔兩個位元組,英文1個
如果是UTF-8,漢字一般佔3個位元組,英文還是1個。 
但是一般情況下,我們都認為是兩個位元組處理,因為oracle安裝時候預設我們都選擇GBK的編碼格式,但是我們在頁面做輸入字串長度的校驗的時候,還是以資料庫設計欄位最大長度除3來作為最大長度-----防止資料庫移植時設定不同編碼格式;
比如:VARCHAR2(10),一般情況下最多存放5個漢字,10個字元

--nvarchar,nvarchar2 
聯絡:
1.nvarchar/nvarchar2用於儲存可變長度的字串
2.size 的最大值是 4000,而最小值是 1,其值表示字元的個數,而不是位元組數
3.這兩種型別更適合儲存中文

區別:
1.nvarchar中字元為中文則一般按2個位元組計算,英文數字等按照一個自己計算
2.nvarchar2中所有字元均按照2個位元組計算;
3.nvarchar2雖然更佔空間,但是它有更好的相容性,所有推薦使用;

VARCHAR2(size)

可變長度的字串,其最大長度為size個位元組;size的最大值是4000,而最小值是1;你必須指定一個VARCHAR2的size;

NVARCHAR2(size)

可變長度的字串,依據所選的國家字符集,其最大長度為size個字元或位元組;size的最大值取決於儲存每個字元所需的位元組數,其上限為4000;你必須指定一個NVARCHAR2的size;

NUMBER(p,s)

精度為p並且數值範圍為s的數值;精度p的範圍從1到38;數值範圍s的範圍是從-84到127;
例如:NUMBER(5,2) 表示整數部分最大3位,小數部分為2位;
NUMBER(5,-2) 表示數的整數部分最大為7其中對整數的倒數2位為0,前面的取整。
NUMBER 表示使用預設值,即等同於NUMBER(5);

LONG

可變長度的字元資料,其長度可達2G個位元組;

DATE

有效日期範圍從公元前4712年1月1日到公元后4712年12月31日

RAW(size)

長度為size位元組的原始二進位制資料,size的最大值為2000位元組;你必須為RAW指定一個size;

LONG RAW

可變長度的原始二進位制資料,其最長可達2G位元組;

CHAR(size)

固定長度的字元資料,其長度為size個位元組;size的最大值是2000位元組,而最小值和預設值是1;

NCHAR(size)

也是固定長度。根據Unicode標準定義

CLOB

一個字元大型物件,可容納單位元組的字元;不支援寬度不等的字符集;最大為4G位元組

NCLOB

一個字元大型物件,可容納單位元組的字元;不支援寬度不等的字符集;最大為4G位元組;儲存國家字符集

BLOB

一個二進位制大型物件;最大4G位元組

BFILE

包含一個大型二進位制檔案的定位器,其儲存在資料庫的外面;使得可以以字元流I/O訪問存在資料庫伺服器上的外部LOB;最大大小為4G位元組.