關於char和varchar2的比較

2021-05-26 11:53:10 字數 3473 閱讀 7923

char和varchar2比較

一些應注意的問題

關於char和varchar2的比較

char型別與char型或字元常量的比較,在比較時使用補齊空格的方式進行比較。

varchar2型別與varchar2型別,char型和字元常量的比較,在比較時不補充空格,直接比較。

create table tt(a1 char(2) , a2 varchar2(2)) ;

insert into tt values('a','a') ;

insert into tt values('a','a ') ;

commit ;

--char型與字元常量的比較,字元常量作為char型處理

--與'a'比較,返回2行,也就是在比較時自動將常量'a'右補齊空格後比較

select * from tt where a1='a' ;

a1 a2

-- --

a  a

a  a

--與'a '比較,返回2行,也就是在比較時自動將常量'a'右補齊空格後比較

select * from tt where a1='a ' ;

a1 a2

-- --

a  a

a  a

--varchar2與常量的比較,字元常量作為varchar2型處理

--與'a'比較,返回1行,也就是在比較時對'a'不做處理,直接比較

select  * from tt where a2='a';

a1 a2

-- --

a  a

--與'a '比較,返回1行,也就是在比較時對'a'不做處理,直接比較

select  * from tt where a2='a ';

a1 a2

-- --

a  a

--當char型別和varchar2型別比較時,

比較時對字段值是不作處理,直接比較的

--讓a1和a2直接比較,此時是直接比較,有一條記錄(第二條)的a1和a2相同

select * from tt where a1=a2 ;

a1 a2

-- --

a  a

但是當和decode函式配合使用時,出現不同的情況

使用a1欄位

select  decode(a1,'a','aaaa','bbbb') from tt ;

decode(a1,'a','aaaa','bbbb')

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

bbbb

bbbb

雖然a1欄位為char(2),但是比較時並沒有將常量'a'補空格再與字段a1做比較,

而是直接進行比較,也就是將兩個比較字段按照varchar2型別處理的

因此比較時認為欄位a1不等於常量'a',出現兩條結果為'bbb'的記錄。

進一步驗證,

select  decode(a1,'a  ','aaaa','bbbb') from tt ; --此處是兩個空格

decode(a1,'a','aaaa','bbbb')

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

bbbb

bbbb

還是返回兩條'bbb'的記錄,說明比較的不是按照char型的比較規則處理的。

使用a2欄位

select  decode(a2,'a','aaaa','bbbb') from tt ;

decode(a2,'a','aaaa','bbbb')

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

aaaa

bbbb

此時是正常的varchar2型別之間的比較,第一條記錄的a2欄位等於'a',返回'aaa',

第二行記錄的a2欄位為』a ',比較時不等,返回'bbb'

當使用case表示式處理a1欄位時,出現了與decode函式不同的處理結果

使用欄位a1

select  case a1 when 'a' then 'aaa' else 'bbb' end from tt ;

casea1when'a'then'aaa'else'bbb

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

aaaaaa

在使用case語句中使用a1欄位與常量'a'比較時,

兩個比較值按照char型的比較規則處理,在右補空格之後進行比較,

因此返回兩條記錄

進一步驗證,如下,

select  case a1 when 'a   ' then 'aaa' else 'bbb' end from tt ;

casea1when'a'then'aaa'else'bbb

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

aaaaaa

此時將常量改為'a   ',比較時仍視為char型別之間的比較,將字段a1補齊空格後與常量比較。

使用a2欄位

select  case a2 when 'a' then 'aaa' else 'bbb' end from tt ;

casea2when'a'then'aaa'else'bbb

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

aaabbb

此時是正常的varchar2型別之間的比較,第一條記錄的a2欄位等於'a',返回'aaa',第二行記錄的a2欄位為』a ',比較時不等,返回'bbb'

總結,

在使用decode函式(包括其它函式)對char欄位做比較時,需要注意即使比較的兩個欄位都是char型別,

但是decode函式是將其轉化varchar2型別 進行處理,不遵循char型的比較規則

而case為表示式,仍遵循char型的比較規則另:

對於char資料,在集合操作中,按照char的實際資料進行比較,

而不是按照char型資料的比較規則進行的。

下面是乙個簡單例子

create table t1(name char(10)) ;

create table t2(name char(20)) ;

begin

for i in 1..5 loop

insert into t1 values(to_char(i)) ;

insert into t1 values(to_char(i)) ;

end loop ;

commit;

end ;

select name from t1 minus select name from t2 ;

name

-------------------- 1

2 34 5

如果按照char型的比較規則,則不應該有返回值。

select anem from t1 intersect select name from t2 ;

name

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

無返回值,也說明集合操作時比較沒有按照char型的比較規則。

char和varchar2的區別

區別 1 char的長度是固定的,而varchar2的長度是可以變化的,比如,儲存字串 abc 對於char 20 表示你儲存的字元將佔20個位元組 包括17個空字元 而同樣的varchar2 20 則只占用3個位元組的長度,20只是最大值,當你儲存的字元小於20時,按實際長度儲存。2 char的效...

Oracle中char和varchar2的區別

1.char的長度是固定的,而varchar2的長度是可以變化的,比如,儲存字串 abc 對於char 20 表示你儲存的字元將佔20個位元組 包括17個空字元 在資料庫中它是以空格佔位的,而同樣的varchar2 20 則只占用3個位元組的長度,20只是最大值,當你儲存的字元小於20時,按實際長度...

實驗說明varchar2和char最大長度

實驗說明varchar2和char最大長度 引言 區別 1 char的長度是固定的,而varchar2的長度是可以變化的,比如,儲存字串 abc 對於char 20 表示你儲存的字元將佔20個位元組 包括17個空字元 而同樣的varchar2 20 則只占用3個位元組的長度 20只是最大值,當你儲存...