先建表做一個測試:
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 進行匹配,而不建議使用帶函數的索引。
如果不涉及索引,兩種方法都可以。