Oracle中char,varchar,varchar2,nvarchar,nvarchar2的區別


1、概述數據庫


1.char oracle


  char的長度是固定的,好比說,你定義了char(20),即便你你插入abc,不足二十個字節,數據庫也會在abc後面自動加上17個空格,以補足二十個字節; 函數

  

  char是區分中英文的,中文在char中佔兩個字節,而英文佔一個,因此char(20)你只能存20個字母或10個漢字。 學習

  

  char適用於長度比較固定的,通常不含中文的狀況 ui


2.varchar,varchar2 編碼


  varchar是長度不固定的,好比說,你定義了varchar(20),當你插入abc,則在數據庫中只佔3個字節。 spa

  

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

  

  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 


4.varchar,nvarchar,nvarchar,nvarchar2

   四個類型都屬於變長字符類型, varchar和varchar2的區別在與後者把全部字符都佔兩字節,前者只對漢字和全角等字符佔兩字節。 

   nvarchar和nvarchar2的區別和上面同樣,與上面區別在因而根據Unicode標準所進行的定義的類型,一般用於支持多國語言相似系統的定義。 


2、應用 

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的掃描。 


3、選擇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 數據類型。 


4、簡述


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) 

相關文章
相關標籤/搜索