使用LIKE子句正确格式化sql查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用LIKE子句正确格式化sql查询相关的知识,希望对你有一定的参考价值。

我有一个带有LIKE子句的SQL查询,该子句使用%通配符。我已经读过LIKE子句可能有问题,比如:http://githubengineering.com/like-injection/。但我不确定下面两个不同的函数调用之间是否存在某些用户输入的性能差异(尽管查询基本相同),如果它们之间的差异与链接中讨论的内容有关。

我预计对第一个函数的调用只会返回“&my-query%”之类的结果,所以字面上用户的输入会被百分之二的符号所吸引,但事实并非如此。

(query db ["SELECT * FROM some_table WHERE some_value LIKE ?"
       (str "%" user-input "%")])

(query db ["SELECT * FROM some_table WHERE some_value LIKE '%' ? '%']"
       user-input])
答案

您的第一个查询对我来说很安全。第二个看起来像无效的SQL。看起来你正试图这样做:

(query db ["SELECT * FROM some_table WHERE some_value LIKE CONCAT('%', ?, '%')"
   user-input])

这也很安全。

不安全的查询会将用户输入直接嵌入到SQL字符串中,如下所示:

(query db [(str "SELECT * FROM some_table WHERE some_value LIKE '%" user-input "%'")])

以上是关于使用LIKE子句正确格式化sql查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPQL 中正确执行 LIKE 和 CASE 子句

sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片

如何在同一SQL查询中合并子句LIKE和BETWEEN?

MYSQL如何进行sql like (sql查询结果)的查询

如何在 PL/SQL 的 LIKE 子句中使用变量

当“LIKE”子句包含参数时,SQL Server 不使用索引