以下面的例子为例(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
查询状态为'小于 1% 的脂肪'
,但实际上我们得到的比我们想要的多:
less than 1% fat
less than 1% of doctors recommend this - it's full of fat!
为了获得所需的行为,我将 @query
更改为 'less than 1[%] fat'
- 然后仅返回第一个结果。
是否有标准方法为使用 LIKE
的子句准备字符串,还是我必须自己动手?
最佳答案
您可以使用自由文本搜索和 CONTAINS 而不是使用 LIKE或 FREETEXT谓词。带有前导通配符的 LIKE 忽略索引并导致全表扫描,而全文搜索使用现有的自由文本索引来加快搜索速度。您将必须配置 free text indexing在你可以使用它之前。
如果您想坚持使用 LIKE,最好的解决方案是在您的客户端代码中转义该字符串。 T-SQL 提供非常有限的字符串操作功能和 REPLACE函数甚至不接受通配符。您将不得不嵌套多个 REPLACE 语句以说明 LIKE 使用的所有通配符。
如果您的搜索字符串可能包含 [ 或 ] 字符,您可以将它与 ESCAPE 子句结合使用并使用 §、¶ 或 ¤ 等罕见字符作为转义字符。
关于sql - 如何为 SQL LIKE 转义用户输入中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648406/