Sql Server LIKE 查询中需要转义哪些字符[重复]

Posted

技术标签:

【中文标题】Sql Server LIKE 查询中需要转义哪些字符[重复]【英文标题】:What characters need to be escaped in a Sql Server LIKE query [duplicate] 【发布时间】:2018-05-06 07:55:37 【问题描述】:

SQL 服务器查询中的 LIKE 运算符对于匹配自定义模式非常有用。然而,有时需要从模式中转义一些字符或子字符串,例如和号'%'、下划线'_'、方括号'['和']'等。

确实,我正在使用 parametrized queries,但它不能解决 LIKE 情况,因为例如搜索 _ 将意味着“任何字符”。

在转义此类模式时必须考虑的字符集是什么?是否可以提供 C# 函数来执行安全转义?

【问题讨论】:

见***.com/questions/19730941/… 这个问题似乎没有解决同样的问题:我想要一整套字符来转义.... “一组双引号”不是字符。在任何情况下,双引号都不需要转义。单引号可以,但是出现一次还是多次都不会影响它的转义方式,每次都是一样的。 @Starnutoditopo 为什么?您不应该在 LIKE 谓词的参数中转义字符串 - 您应该将它们作为正确的参数传递。然后,您避免任何需要转义并且您也倾向于避免 SQL 注入漏洞。 @AaronBertrand: LIKE 转义与值转义明显不同,不能仅通过参数传递来解决。 DECLARE @p VARCHAR(10) = '[[]]'; SELECT 1 WHERE ']' LIKE @p 不会返回任何内容;至少你需要像DECLARE @p VARCHAR(10) = '[\[\]]'; SELECT 1 WHERE ']' LIKE @p ESCAPE '\' 这样的东西,即使参数是参数化的。 【参考方案1】:

%、_、[、] 和 ^ 需要转义,并且您需要选择合适的转义字符,即您在 LIKE 模式的其他地方没有使用的转义字符。

这里有完整的描述LIKE (Transact-SQL)

我相信你可以用 C# 编写一个函数来做到这一点。

【讨论】:

@Starnutoditopo Seems to work fine for me. 当然,如果您在 C# 中构造 sql 字符串,那么您必须在代码中转义双引号,但您不会在 SQL 查询窗口中,因为字符串分隔符是 ' .不过,不确定这就是您的问题。 您错过了-,它需要在[a-z] 中进行转义,以及转义字符本身,即您使用ESCAPE 选择的任何内容(默认情况下,没有转义字符)。 @JeroenMostert, - 不需要转义。它在方括号内的用法,即 [a-e] 是显而易见的,在它们之外它被视为自身。但是,您是对的,我没有提到您必须选择转义字符,但该信息在链接中。 对——如果您已经在转义括号,- 将永远不会出现需要转义的情况。如果你没有转义括号,大概是因为你想让用户能够传递模式,在这种情况下他们会负责转义。 (是的,关于转义字符的信息在链接中,但这当然没有理由不把它放在答案中。)【参考方案2】:

在此处查看现有的 *** 答案...

How to use wildcards in SQL query with parameters

一定要使用 SQLParameter

不要使用 stringbuilder 或一起添加字符串

除非你了解 SQL 注入攻击 https://en.wikipedia.org/wiki/SQL_injection

【讨论】:

这与问题完全无关 - 虽然使用参数化查询是一种很好的做法,但最多应该是评论。

以上是关于Sql Server LIKE 查询中需要转义哪些字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 转义select …. like中的特殊字符(百分号)

Mysql like语句转义字符

sql特殊字符怎么转义

sql server打不出英文下划线

sql模糊查询

在 SQL 注入中使用 LIKE 构建查询是不是安全?