zoukankan      html  css  js  c++  java
  • SQL特殊字符处理zz

    用户输入如果没有任何限制的话,则必须对特殊字符进行变换。
    如果对单引号不进行变换,则会发生数据库错误,甚至可能导致系统崩溃。
    不 过回避方法却非常简单,只要将单引号[']转换成两个单引号['']就可以了。
    例: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
    ' %[[]% '
     

  • 相关阅读:
    刷题总结——table(ssoi)
    算法复习——差分约束(ssoi种树)
    刷题总结——谈笑风生(主席树+dfs序的应用)
    刷题总结——序列操作(权值线段树套树状数组)
    刷题总结——shortest(ssoi)
    算法总结——主席树(poj2104)
    刷题总结——路径(ssoi)
    刷题总结——鸭舌(ssoi)
    刷题总结——电影(ssoi)
    刷题总结——随机图(ssoi)
  • 原文地址:https://www.cnblogs.com/end/p/1778041.html
Copyright © 2011-2022 走看看