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只是最大值,當你儲存...