在Sql Server的LIKE查询中哪些字符需要转义

5
SQL服务器查询中的LIKE运算符可以非常有用地匹配自定义模式。然而,有时需要从模式中转义一些字符或子字符串,例如“%”、“_”、“[”和“]”等符号。
实际上我正在使用parametrized queries但它不能解决LIKE情况,因为例如搜索_将意味着“任何字符”。
在转义此类模式时,应考虑哪些字符集?是否可以提供一个C#函数来执行安全转义?

请参见 https://dev59.com/YGIj5IYBdhLWcg3w8ZYF。 - IRQ Conflict
1
那个问题似乎没有解决同样的问题:我想要一个完整的字符集来转义... - Starnuto di topo
“一组双引号”不是一个字符。无论如何,双引号都不需要转义。单引号需要转义,但它出现一次还是多次对于它的转义方式没有影响,每次都是相同的。 - Jeroen Mostert
@Starnutoditopo 为什么?在 LIKE 谓词的参数中转义字符串是不必要的 - 你应该将它们作为正确的参数传递。这样,你就可以避免任何需要转义的情况,并且还可以避免 SQL 注入漏洞。 - Aaron Bertrand
1
@AaronBertrand:LIKE转义和值转义是明显不同的,不能仅通过参数传递来解决。DECLARE @p VARCHAR(10) = '[[]]'; SELECT 1 WHERE ']' LIKE @p将返回空值;至少需要像DECLARE @p VARCHAR(10) = '[\[\]]'; SELECT 1 WHERE ']' LIKE @p ESCAPE '\'这样的代码,即使参数化也是如此。 - Jeroen Mostert
@JeroenMostert,我只是试图引导用户远离通过将参数连接到WHERE子句来构建SQL查询。 - Aaron Bertrand
2个回答

4

需要转义的字符包括%,_,[,]和^,您需要选择一个合适的转义字符,即在LIKE模式中没有使用过的字符。

完整说明请参见LIKE(Transact-SQL)

我相信您可以编写一个C#函数来执行此操作。


@Starnutoditopo 对我来说似乎工作正常 - Aaron Bertrand
当然,如果您在C#中构建SQL字符串,则必须在代码中转义双引号,但是在SQL查询窗口中不需要,因为字符串定界符是'。不过我不确定这是否是您的问题。 - spodger
你错过了-,它需要在[a-z]中进行转义,并且还有转义字符本身,这取决于你使用的ESCAPE(默认情况下没有转义字符)。 - Jeroen Mostert
@JeroenMostert,-不需要转义。它在方括号内的使用,例如[a-e]是显而易见的,在方括号外则被视为自身。然而,你说得对,我没有提到你必须选择一个转义字符,但这个信息在链接中有提到。 - spodger
如果您已经转义了括号,那么“-”就不会出现需要转义的情况。如果您没有转义括号,那么可能是因为您希望用户能够传递模式,这种情况下他们会自行处理转义。 (是的,关于转义字符的信息在链接中,但这当然不是不将其放入答案的理由。) - Jeroen Mostert
好的,我会更新答案。 :-) - spodger

-1

这与问题完全无关 - 虽然使用参数化查询是良好的实践,但最多应该只是注释。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接