如何在SQL LIKE的用户输入中转义特殊字符?

Ale*_*rey 2 sql sql-server code-injection

以下示例(SQL Server 2008 - 可能更多).您必须想象一下@query其源是用户输入的参数:

DECLARE @query varchar(100)
SET @query = 'less than 1% fat'

CREATE TABLE X ([A] VARCHAR(100))
INSERT X VALUES ('less than 1% fat')
INSERT X VALUES ('less than 1% of doctors recommend this - it''s full of fat!')
SELECT * FROM X WHERE A LIKE '%' + @query + '%'
DROP TABLE X
Run Code Online (Sandbox Code Playgroud)

查询说明了'less than 1% fat',但实际上我们获得了比我们想要的更多:

less than 1% fat
less than 1% of doctors recommend this - it's full of fat!
Run Code Online (Sandbox Code Playgroud)

为了获得所需的行为,我@query改为'less than 1[%] fat'- 然后只返回第一个结果.

有没有一种标准的方法来为使用LIKEs的子句准备字符串,还是我必须自己滚动?

Pan*_*vos 6

您可以使用自由文本搜索和CONTAINSFREETEXT谓词,而不是使用LIKE .LIKE使用前导通配符忽略索引并导致全表扫描,而全文搜索使用现有的自由文本索引来加速搜索.您必须先配置自由文本索引,然后才能使用它.

如果你想坚持使用LIKE,最好的解决方案是在客户端代码中转义字符串.T-SQL提供非常有限的字符串操作功能,REPLACE函数甚至不接受通配符.您必须嵌套多个REPLACE语句以考虑LIKE使用的所有通配符.

如果搜索字符串可能包含[或]字符,则可以将其与ESCAPE子句组合使用,例如§,或¤等稀有字符作为转义字符.


Luc*_*ero 6

SQL Server允许您指定转义字符,然后您可以在使用它之前转义查询字符串.

我链接的MSDN页面中的示例:

SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
Run Code Online (Sandbox Code Playgroud)