今天接觸到一個比較有意思的問題,常見到極易忽略,但又不經意間掉坑又不容易出來。
創建表:
CREATE TABLE TEMP_DECODE
(
BORROW_TYPE CHAR(1),
BORROW_TYPE1 CHAR(2),
BORROW_TYPE2 VARCHAR2(10),
BORROW_TYPE3 INT
)
執行SQL如下:
SELECT DECODE(BORROW_TYPE,'7','ABC','HELLO'),
DECODE(BORROW_TYPE1,'7','ABC','HELLO'),
DECODE(BORROW_TYPE1,7,'ABC','HELLO'),
DECODE(BORROW_TYPE2,'7','ABC','HELLO'),
DECODE(BORROW_TYPE3,'7','ABC','HELLO')
FROM TEMP_DECODE
您認為結果會是什么樣子呢?
其實結果是這家伙,是否和您預想的一樣呢?
此時我們想起來,我們都知道Char類型是定長的(掉坑里了吧),所以'7'在Char(2)類型中存儲的肯定的不是'7'了,而是數據庫又填補了一個字符,問題來了,填充的是什么呢?
其實是空格(""),如下這個SQL
SELECT DECODE(BORROW_TYPE,'7','ABC','HELLO'),
DECODE(BORROW_TYPE1,'7 ','ABC','HELLO'),--注意這個地方的空格
DECODE(BORROW_TYPE1,7,'ABC','HELLO'),
DECODE(BORROW_TYPE2,'7','ABC','HELLO'),
DECODE(BORROW_TYPE3,'7','ABC','HELLO')
FROM TEMP_DECODE
結果是:
這個問題雖不常見,但極容易掉坑,如果是枚舉類型如(1,2,3,4..)之類的DB里面建議還是用smallint吧,如果是非字符的就用varchar2類型吧,char類型還是盡量少用。想象一下您本來CHAR(1)用的好好的,
結果別人把這個長度改成CHAR(2)了,您之前的SQL是不是直接就DUANG了(如果存儲的都是數值您直接寫成數值類型也可以的如第一個SQL,只是這個場景下我不知道您為什么不用smallint呢)?