ORACLE中關於 char 和 varchar2 的比較


先建表做一個測試:

CREATE TABLE TT(CHAR2 CHAR(2) , VARC2 VARCHAR2(2)), CHAR2 CHAR(3) ;
INSERT INTO TT VALUES('A','A','A') ;
INSERT INTO TT VALUES('A','A ','A') ;
COMMIT ;

1、CHAR 類型 與 CHAR型 比較,補齊空格。也就是說,CHAR 與 CHAR 類型比較時,不管各自定義的長度是多少,都能等。

SELECT * FROM TT WHERE TT.CHAR2 = TT.CHAR3

CHAR2 VARC2 CHAR3
----- ----- -----
A A A
A A A

2、CHAR與字符常量的比較,補齊空格。也就是說,常量后邊不用加空格也能匹配CHAR類型,不管CHAR定義的長度是多少。

SELECT * FROM TT WHERE TT.CHAR2 = 'A' ;

SELECT * FROM TT WHERE TT.CHAR3 = 'A' ;
CHAR2 VARC2 CHAR3
----- ----- -----
A A A
A A A  

3、VARCHAR2 與常量比較,不處理空格,也就是說,如果你的數據中有空格,是找不出來的。如下,只能找到  'A'  的,而找不到  'A '  的。(第二個A后面有一個空格)

SELECT * FROM TT WHERE TT.VARC2 = 'A' ;

CHAR2 VARC2 CHAR3
----- ----- -----
A     A     A

4、當CHAR類型和VARCHAR2類型比較時,比較時對字段值不作處理,直接比較。 也就是說,如果字符長度不一樣,VARCHAR2 需要補齊空格,或者 CHAR 需要去掉空格才能相等。

SELECT * FROM TT WHERE TT.CHAR2 = TT.VARC2;

CHAR2 VARC2 CHAR3
----- ----- -----
A     A     A                ---只找出了相同的列,(有空格的‘A ’查不出來)

 

5、怎么處理不同表中,根據不同場景所定義的  VARCHAR2 與 CHAR 的匹配呢?

兩種方法:

5.1  用RPAD 對 VARCHAR2 補齊長度,以上表為例

SELECT * FROM TT WHERE RPAD(TT.VARC2 ,2 ,' ' )  = TT.CHAR2;

CHAR2 VARC2 CHAR3
----- ----- -----
A     A     A
A     A     A

5.2 用TRIM 函數對 VARCHAR2 和 CHAR 去空格。

SELECT * FROM TT WHERE TRIM(TT.VARC2)  =  TRIM(TT.CHAR2);

CHAR2 VARC2 CHAR3
----- ----- -----
A     A     A
A     A     A

大家可以根據自己的需求,選擇其中一種進行轉換。

小TIPS:如果該列建立了索引,則建議使用 VARCHAR2 補齊空格的方法與 CHAR 進行匹配,而不建議使用帶函數的索引。

如果不涉及索引,兩種方法都可以。

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM