SQL特殊字元處理zz

l_serein發表於2012-11-28
使用者輸入如果沒有任何限制的話,則必須對特殊字元進行變換。
如果對單引號不進行變換,則會發生資料庫錯誤,甚至可能導致系統崩潰。
不 過迴避方法卻非常簡單,只要將單引號[']轉換成兩個單引號['']就可以了。
例: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 '\'


一、搜尋萬用字元字元的說明

可以搜尋萬用字元字元。有兩種方法可指定平常用作萬用字元的字元:

  • 使用 ESCAPE 關鍵字定義轉義符。在模式中,當轉義符置於萬用字元之前時,該萬用字元就解釋為普通字元。例如,要搜尋在任意位置包含字串 5% 的字串,請使用:
    WHERE ColumnA LIKE '%5/%%' ESCAPE
     '/'
    
    

    在上述 LIKE 子句中,前導和結尾百分號 (%) 解釋為萬用字元,而斜槓 (/) 之後的百分號解釋為字元 %。

  • 在方括號 ([ ]) 中只包含萬用字元本身。要搜尋破折號 (-) 而不是用它指定搜尋範圍,請將破折號指定為方括號內的第一個字元:
    WHERE ColumnA LIKE '9[-]5'
    
    

    下表顯示了括在方括號內的萬用字元的用法。

    符號 含義
    LIKE '5[%]' 5%
    LIKE '5%' 5 後跟 0 個或更多字元的字串
    LIKE '[_]n' _n
    LIKE '_n' an, in, on (and so on)
    LIKE '[a-cdf]' a, b, c, d, or f
    LIKE '[-acdf]' -, a, c, d, or f
    LIKE '[ [ ]' [
    LIKE ']' ]

二、例項說明:

在表PersonalMember中查詢 strloginname欄位中含有"["的記錄。

可用三條語句:
1、

 select  strloginname, *   from  PersonalMember  where  strloginname  like  ' %[% '   escape   ' '

2、(說明"\"與"/"均可與escape關鍵字結合作為轉 義符)

 select  strloginname, *   from  PersonalMember  where  strloginname  like  ' %/[% '   escape   ' / '


3、
 select  strloginname, *   from  dbo.PersonalMember  where   charindex ( '[ ' ,strloginname) > 0

4、
 select  strloginname, *   from  dbo.PersonalMember  where strloginname   like 
 
' %[[]% '

相關文章