SQL模糊匹配中特殊字符的处理

在使用LIKE关键字进行模糊查询时,%_[]单独出现时,会被认为是通配符。为了在字符数据类型的列中查询是否存在百分号%、下划线_或者方括号[]字符,就需要有一种方法告诉DBMS,将LIKE判式中的这些字符看作是实际值,而不是通配符。

解决方案

关键字ESCAPE允许确定一个转义字符,告诉DBMS紧跟在转义字符之后的字符看作是实际值。

因此,我们可以先将参数中的%替换成\%_替换成\_

1
2
3
4
5
6
// 防止SQL注入:%以及_的处理
String id = activeConfigReqSource.getId();
if (id.contains("%") || id.contains("_")) {
id = id.replace("%","/%").replace("_","/_");
}
activeConfigReq.setId(id);

然后在SQL语句中通过ESCAPE关键词确定/为转义字符:

1
2
3
4
5
6
7
8
9
10
SELECT name,id
FROM agents
<where>
<if test="activeConfigReq.name != null and activeConfigReq.name != ''">
AND name like CONCAT("%",#{activeConfigReq.name},"%") ESCAPE '/'
</if>
<if test="activeConfigReq.id != null and activeConfigReq.id != ''">
AND id like CONCAT("%",#{activeConfigReq.id},"%") ESCAPE '/'
</if>
</where>

----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道