同樣的sql執行結果不同的原因分析 (r4筆記第27天)
今天開發的同事問我一個問題,說有一個sql語句,在weblogic的日誌中執行沒有結果,但是手動拷貝資料到客戶端執行,卻能夠查到。這種奇怪的問題一下子就能引起我的好奇心,從我知道的原因來看啊,可能是存在不可見字元造成的。
對於不可見字元的問題,有必要先說明一下,可以簡單舉個例子。
我們建立一個表,然後插入的資料含有不可見字元,比如回車,換行符。
SQL> create table test as select object_id,object_name||chr(10) objname from all_objects where rownum<3;
Table created
插入資料之後,我們檢視一下資料。
SQL> select *from test;
OBJECT_ID OBJNAME
---------- -------------------------------
20 ICOL$
46 I_USER1
SQL> select *from test where objname='I_USER1';
no rows selected --但是查詢的時候卻沒有任何結果
如果我們在查詢中明確的加入那個不可見字元,就可以很容易就插敘出來。
SQL> select *from test where objname='I_USER1'||chr(10);
OBJECT_ID OBJNAME
---------- -------------------------------
46 I_USER1
SQL> select object_id,dump('I_USER1') DUMP1,dump(objname) DUMP2 from test where objname like 'I_USER%';
OBJECT_ID DUMP1 DUMP2
---------- ---------------------------------- --------------------------------------------------
46 Typ=96 Len=7: 73,95,85,83,69,82,49 Typ=1 Len=8: 73,95,85,83,69,82,49,10
entity_id status distribute_no xxxx
100 ACTIVE 100001 xxxxx
分析了這些之後,問題就一下子明朗多了,不是什麼特別的bug,不是什麼特別的場景,都是潛意識中自己被誤導了。所以大家在排查問題的時候,可能提供給你的資訊不是最全面最完整的,我們需要分析去佐證。