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

标签 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

查询状态为'小于 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/

相关文章:

sql - 需要sql查询中的Range计数

java - 其他具有编译时/运行时 "mixins"功能的框架,例如 Spring Roo for Java

python - CreateRemoteThread() 未按预期运行

sql,使用内连接进行查询优化?

c# - 用于删除和创建文件夹的 SSIS 脚本

sql-server - 嵌套查询中 SQL Server 的列名无效

javascript - 所有页面标题中的可疑 javascript(同一服务器上的多个网站)

mysql - MYSQL中如何获取身份证?

sql - 列出参与多个项目的员工姓名

mysql - 使用 SQL 更新数据库中的数据