回答

收藏

使用sql参数在SQL LIKE语句中转义特殊字符

技术问答 技术问答 126 人阅读 | 0 人回复 | 2023-09-13

我有一张桌子,上面放着产品。我需要进行查询,以找到所有与用户输入值匹配的结果。我正在使用SqlParameter输入的插入。6 G1 q1 H/ E+ T# o& h1 A7 f( l
SqlCommand findProcutsByPattern = new SqlCommand(
+ \. c9 F5 Q8 G% I; q    "SELECT *" +
5 E: @9 V% X$ _. ^7 o6 f: v7 V    " FROM [Products]" +; T( ?7 f( F. {/ G  L
    " WHERE ProductName LIKE @pattern", connection);
& y4 t. Q+ s- _3 ^8 y; hfindProcutsByPattern.Parameters.AddWithValue("@pattern", '%' + pattern + '%');9 t3 c& H% x5 u; f& ?- ~* U1 ]
当用户输入字符串包含“ _”或“%”时,就会出现问题,因为它们被解释为特殊字符。另一方面,请考虑以下因素:9 c9 z) W/ q& B5 g* y2 h* |  {
* k; N4 K; U0 M% a7 y% i4 u! V: D
命令对象使用参数将值传递给SQL语句或存储过程,从而提供类型检查和验证。与命令文本不同,参数输入被视为文字值,而不是可执行代码。
+ t& j+ a" L( q! a1 J) _! L& G

1 {0 Z7 q! A; I& W( U我不应该有这样的问题。我是否需要替换/转义输入字符串中的所有“ _”和“%”,还是有一个更优雅的解决方案?我希望将输入视为文字。! B7 P5 G. s3 v: n  \$ V# \
我在表中有一些记录,这些记录的名称中包含特殊字符(N_EW,N \ EW,N%EW,N” EW,N’EW)。将 ** , ”**
3 r( S& d$ b& Q' H5 J- f1 \指定为输入效果很好(考虑它们作为文字)。
3 _* }" E* v2 T" m$ `$ s5 l, {$ x                , m5 }4 W) w" O0 N
解决方案:( ^9 `6 `* l+ j% f3 X0 t2 c6 x
               
: `2 A" O# j8 h8 _6 \: \- H: ?& q
; p4 e, \" s8 A1 Y, B$ ]% S9 c& J1 S
                您有两种选择:
9 N8 O$ |" B( h/ h$ ?) _0 b. r将它们包含在[和中]。所以:where pattern like '[%]'
8 Q; ~& y& `% R4 |5 ^
$ k) O; k2 d4 ^  b: |2 W( l) d  c( r

% ^3 q' D* J0 m5 z# w( `( C查找百分比字符。要转义的字符的完整列表- '_', '%', '[', ']'带有相应的替换'[_]', '[%]', '[[]',
( g% i8 ?8 w* j'[]]'。可以在转义转义符不起作用的示例代码中找到SQLLIKE运算符+ |/ L4 A( ]1 A
使用不太可能出现在字符串中的转义字符,例如反引号:where pattern like '`%' escape '`'
" A9 w: H/ k! o  r$ n0 ^/ o) Z
9 h. S. S8 X" b! p- l) `- e' a
( F: a' B  ^, J' ^9 b  C; r$ P
(请参阅MSDN- LIKE(Transact-SQL)上的语法。)% S  ^" |: E- @: X
在这两种情况下,我都建议您在应用程序层进行替换,但如果您确实需要,也可以在SQL中进行替换:
, {% A- ^+ Q* v/ K& w( q( c3 awhere pattern like replace(@pattern, '%', '[%]')
/ x: x( `+ X) F$ ^7 G而且,就用户界面而言,向最终用户提供通配符访问权限可能是一件好事。
% x1 D3 n( \5 z; J$ O
! E2 Y: y5 ?5 q2 ^! y% G注:有几个比较特殊的字符'-',并'^'在LIKE查询,但他们并不需要,如果你已经逃离转义'['和']'。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则