天天看點

ORACLE字元類型詳解----char、nchar、varchar、varchar2、nvarchar2

ORACLE字元類型詳解----char、nchar、varchar、varchar2、nvarchar2  轉載自:http://www.2cto.com/database/201310/252696.html

    oracle提供了五種字元資料類型:char、nchar、varchar、varchar2、nvarchar2。     char:使用資料庫字元集來存儲資料,長度固定,如 果存儲的資料沒有達到指定長度,自動補足空格 。指定長度時,預設長度的計量機關由NLS_LENGTH_SEMANTICS(預設為位元組byte)參數決定,但是我們可以手動指定為char或者byte。oracle建議使用NLS_LENGTH_SEMANTICS來指定計量機關,這樣可以提高效率。char類型的最大存儲長度為2000個位元組,在plsql中,最大存儲長度可以達到32767個位元組。使用char時, 可以不指定最大長度,此時最大長度為1.     nchar:使用國家字元集來存儲資料,長度固定,如果 存儲的資料沒有達到指定長度,資料庫自動補足空格 。指定長度時, 采用char為計量機關 ,不可以手動指定其他機關。最大存儲長度為2000個位元組,在plsql中,其最大存儲長度可以達到32767個位元組。使用nchar時,可以不指定最大長度,此時最大長度為1.   varchar2: 使用資料庫字元集存儲資料, 長度可變,如果存儲資料沒有達到指定長度,不自動補足空格 。可使用char,byte為計量機關,預設受參數NLS_LENGTH_SEMANTICS的影響。最大存儲長度為4000個位元組,在plsql中,存儲長度可達32767個位元組。 必須指定最大長度,長度最小值為1 .   nvarchar2:使用國家字元集來存儲資料,長度可變,如果存儲的資料沒有達到指定長度,不自動補足空格。指定長度時, 采用char為計量機關 ,不可以手動指定其他機關。最大存儲長度為4000個位元組,在plsql中,其最大存儲長度可以達到32767個位元組。必須指定最大長度,長度最小值為1.   varchar:oracle目前并沒有實作該資料類型,目前版本下,varchar與varchar2完全一緻,但不保證将來不會單獨設計varchar。     下面我們隻讨論char和varchar2的差別,至于nchar   nvarchar2  varchar,我相信聰明的同仁們肯定可以觸類旁通。      1:char 與varchar2在存儲上的差別,僅僅在于char會使用空格來填充空間,由于varchar2采用變長的方式存儲資料,是以可以節省空間,這是毋庸置疑的。      2:在效率方面,varchar2和char在某些情況下,各有優劣,并沒有實質上的差别。      3:在字元比較上的差别,是char和varchar2的主要差别。當兩個字元串進行比較時,如果其中任何一個字元串為varchar2類型(文本串作為char類型來處理),那麼兩個字元串直接進行比較; 如果不存在varchar2類型的字元串,在比較之前,會将其中較短的字元串末尾補充空格至與較長字元串長度一緻,然後進行字元的比對。       ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

[sql]

SQL>

create

table

tab1(c1

char

(10),c2 varchar2(10)); 

表已建立。 

SQL>

insert

into

tab1

values

(

'easypoint'

,

'easypoint'

); 

已建立 1 行。 

SQL>

select

*

from

tab1

where

c1=

'easypoint'

C1     C2 

---------- ---------- 

easypoint  easypoint 

SQL>

select

*

from

tab1

where

c2=

'easypoint'

C1     C2 

---------- ---------- 

easypoint  easypoint 

SQL>

select

*

from

tab1

where

c2=

cast

(

'easypoint'

as

varchar2(10)); 

C1     C2 

---------- ---------- 

easypoint  easypoint 

SQL>

select

*

from

tab1

where

c1=

cast

(

'easypoint'

as

varchar2(10)); 

未標明行 

SQL>

select

*

from

tab1

where

c2=

cast

(

'easypoint'

as

char

(10)); 

未標明行 

SQL>  

SQL>

select

*

from

tab1

where

c2=

'easypoint '

未標明行 

SQL>

select

*

from

tab1

where

c1=

'easypoint '

C1     C2 

---------- ---------- 

easypoint  easypoint

    從上面的代碼可以看出,由于char的自動補足,以及char和char類型比較時的自動長度對齊,使得字元串資料的處理顯得難以捉摸。當然,我們可以使用trim或者rpad函數來進行字元串的處理,但是這往往 會導緻索引的失效 。         4:char類型資料可能造成資料資訊的丢失,例如,我們指派”aaa    " 給變量B char(10),當B接收的變量時,其存儲内容為"aaa       ",此時,我們無處指定指派給B的原始值是否包含空格以及包含多少空格。         5:在plsql程式中,在編譯時刻,oracle會為char類型配置設定指定最大長度的記憶體;對于 varchar2類型,如果最大長度沒有超過4000,則在編譯時,配置設定指定最大長度的記憶體;如果長度超過或者等于4000,oracle會在運作時刻配置設定符合實際值大小的記憶體 。             結論:使用varchar2資料類型作為字元串的首選類型,即便是在處理”男“,”女“這樣的性别資料時,使用char類型也不比varchar2類型顯得有優勢。

繼續閱讀