write down,forget
  • adidaseqt
  • eqtturbored
  • eqtsupport9317
  • eqtsupport
  • 9317adidas
  • adidaseqtboost9317
  • eqtsupport93
  • 9317eqt
  • eqt support 9317 adv
  • support 9317 adv
  • eqtadv
  • eqt9317
  • eqtadv9317
  • support93
  • originalseqt
  • adidas eqt
  • eqt support 9317
  • eqt support
  • eqt adv
  • eqt 9317
  • SQL Server查询中处理特殊字符

    <Category: SQL Server> 查看评论

    我们都知道SQL Server查询过程中,单引号“’”是特殊字符,所以在查询的时候要转换成双单引号“””。
    但这只是特殊字符的一个,在实际项目中,发现对于like操作还有以下特殊字符:下划线“_”,百分号“%”,方括号“[]”以及尖号“^”。
    其用途如下:
    下划线:用于代替一个任意字符(相当于正则表达式中的 ? )
    百分号:用于代替任意数目的任意字符(相当于正则表达式中的 * )
    方括号:用于转义(事实上只有左方括号用于转义,右方括号使用最近优先原则匹配最近的左方括号)
    尖号:用于排除一些字符进行匹配(这个与正则表达式中的一样)以下是一些匹配的举例,需要说明的是,只有like操作才有这些特殊字符,=操作是没有的。
    a_b… a[_]b%
    a%b… a[%]b%
    a[b… a[[]b%
    a]b… a]b%
    a[]b… a[[]]b%
    a[^]b… a[[][^]]b%
    a[^^]b… a[[][^][^]]b%

    在实际进行处理的时候,对于=操作,我们一般只需要如此替换:
    ‘ -> ”
    对于like操作,需要进行以下替换(注意顺序也很重要)
    [ -> [[] (这个必须是第一个替换的!!)
    % -> [%] (这里%是指希望匹配的字符本身包括的%而不是专门用于匹配的通配符)
    _ -> [_]
    ^ -> [^]

    在sql语句中,有些特殊字符,是sql保留的。比如 ‘ [ ] 等。我们可以先看看它们的用法。
    2 U* S# k6 B4 Y5 ^# c3 {, E3 i& Z( k
    . O2 G, T” R- n# E4 D+ s& w+ a4 q 当需要查询某数据时,加入条件语句,或着当你需要insert记录时,我们用 ‘ 来将字符类型的数据引起来。比如:) c( H* }# u+ L# v6 c* q! o$ N
    Select * from Customers where City = ‘London’
    ; y5 B. U/ K* {” W ] 当表的名字或列的名字中,含有空格等一些特殊字符时,我们需要用[] 将表名引起来,告诉语法分析器,[]号内的才是一个完整的名称。比如
    , E& R8 w! T# c4 u* f! ESelect * from [Order Details]% X3 g1 s’ A# v4 q; R
    如果,字符数据中,含有 ‘ 改怎么办呢?其实,好多人在这里并没有处理字符川中 ‘ 符号,才造成sql 注射危险。就那上面的那个例子。在Sql语句拼接的时代,比如
    $ Q’ a0 ^0 V# a’ U1 P$ Z% ^ ~9 Z! v
    string sql = “select * from Customers where CustomerID = ‘” + temp + “‘”;* a: n# ~- ]3 s+ l’ z# a8 ^
    如果,我给temp赋值为 Tom’ or 1=1 — – t8 f2 n( T; H9 i+ P9 [
    那么你拼接起来的语句为 select * from Customers where CustomerID = ‘Tom’ or 1=1 — ‘ ” @8 H+ V0 p5 C
    哈哈,1=1 衡为真,—会把后面的sql语句注释掉。而前面因为有输入的 ‘ 而使的语句是合法的。那or的条件,会把所有的记录都选出来。这就是sql注入。在做用户登陆时,如果没有处理该问题,那你的系统受危害的可能性会很高的。
    2 d! C( @+ y. l& Y7 g9 @$ p7 ?3 X 如何处理字符数据中的 ‘ 符号呢? 方法很简单,用两个 ‘ 符号代替一个。 比如,其实际传入的值为Lon’don,处理后为
    ‘ c+ t$ $ Y# J) ! a2 U8 ISelect * from Customers where City = ‘Lon”don’# n” M3 w3 c$ d, s8 f’ T
    如果表或列的名称中含有 [ 或 ] 字符呢?比如Select * from [Order] Details],那中间 ] 符号岂不是先和第一个[ 配了。后面的就是非法的了。怎么办呢? 简单,使用 ]] 代替 ] 。对于[,则无须处理。那就该为! Z& I0 j- g7 G% @
    Select * from [Order]] Details]

    ————————-以上来自网络,未一一验证
    1.有这样一个库:$(DatabaseNa[]me)
    我们可以这样使用:
    use “$(DatabaseNa[]me)”;
    select * from dbo.app_dataconnection;
    或者use [$(DatabaseNa[]me)];
    这样也是可以的。
    2.库改名,加个单引号:$(DatabaseNa[]me’)
    就只能这样了:
    use “$(DatabaseNa[]me’)”;
    select * from dbo.app_dataconnection;
    3.如果再加个双引号呢

    本文来自: SQL Server查询中处理特殊字符

    

    只有 3 条评论 订阅该文评论 RSS

    medcl

    $(Datab[]]aseNa[]me’)”
    这个库名字很BT,use [$(Datab[]]]]aseNa[]]me’)”]

    medcl

    查询条件里面统一加单引号”,替换单引号为两个,作对象用的时候,统一加[],然后替换]为两个
    如,库:$(Datab[]]aseNa[]me’)”,表:$(Table[]]aseNa[]me’)”
    使用:
    use [$(Datab[]]]]aseNa[]]me’)”];

    select * from cwm_core_feature
    where name = ‘$(Table[]]aseNa[]me”)”‘

    ok,搞定~

    medcl

    兼容ANSI SQL-92标准的办法,Oracle、DB2通用,替换双引号为两个
    set quoted_identifier on
    use “$(Datab[]]aseNa[]me’)”””;

    select * from “$(Table[]]aseNa[]me’)”””

    eqt support adidas eqt support 93 primeknit og colorway ba7506 adidas eqt running 93 updated with primeknit construction adidas eqt boost 93 17 white turbo red adidas eqt support 9317 white turbo red adidas eqt support 93 17 adidas eqt support 9317 adidas eqt support 9317 turbo red releases tomorrow adidas originals adidas eqt tactile green pack adidas eqt tactile green pack adidas eqt light green pack womens adidas eqt light green pack coming soon adidas eqt milled leather pack release date adidas originals eqt milled leather pack adidas eqt support ultra boost turbo red white adidas adv support burnt orange grey where to buy the adidas eqt support 9317 turbo red adidas eqt boost 91 16 turbo red adidas eqt support 93 turbo red adidas eqt support 9317 white turbo red available now