用戶輸入如果沒有任何限制的話,則必須對特殊字符進行變換。如果對單引號不進行變換,則會發生數據庫錯誤,甚至可能導致系統崩潰。不過回避方法卻非常簡單,只要將單引號[']轉換成兩個單引號['']就可以了。
例:SELECT * FROM TBL WHERE COL = 'ABC''DEF';
模糊查詢的語句雖然不會發生SQL錯誤,但是不進行回避的話,則無法得到要檢索的值?;乇芊椒ㄝ^單引號復雜。需要使用轉義符。將[%]轉為[\%]、[_]轉為[\_], 然后再加上[ESCAPE '']就可以了。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_%' ESCAPE '';
※最后一個%是通配符。
如果做日文項目的話,會出現全角字符的[%]、[_], 而這兩個全角字符同樣會作為半角通配符處理。所以在變換時,同時需要將全角的[%]、[_]進行變換。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_%_%' ESCAPE '';
變換成這樣似乎結束了,可是不要忘了還有轉義符自身,萬一用戶輸入轉義符的話,
以上的處理就會發生SQL錯誤。所以也必須對轉義符進行變換。變換方法就是將[]轉換為[]。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_%_%' ESCAPE '';
以上的操作都針對于一般的數據類型,如CHAR、VARCHAR2。 如果出現NCHAR、NVARCHAR2的話,以上的處理就會出現ORA-01425錯誤。
如果改成以下寫法,則會發生ORA-01424錯誤。
SELECT * FROM TBL WHERE COL LIKE '%_%' ESCAPE TO_NCHAR('')
正確的寫法應該是
SELECT * FROM TBL WHERE COL LIKEC '%_%' ESCAPE TO_NCHAR('')
最后要說明的是每個like都應該寫ESCAPE語句。
例:
SELECT * FROM TBL
WHERE COL1 LIKE '%_%' ESCAPE '' OR COL2 LIKE '%_%' ESCAPE ''
CREATE TABLE #TEMP (Charcater varchar(50))
insert into #TEMP
values
('werwerweerwe[werwe]werwerwer')
insert into #TEMP
values
('werwerweerwe[zzzzzzzzzz')
insert into #TEMP
values
('werwerweerwe]zzzzzzzzzz')
select * from #TEMP where Charcater like '%]%'
select * from #TEMP where Charcater like '%[[]%'
如果查詢‘[’的則like后應些成[[],而’]‘,則直接寫成]