模糊查询输入%和_会查询全部的问题

Published on with 0 views and 0 comments

相信每个人都写过这样的的 MyBatis 的 SQL 代码:

SELECT *  FROM user 
WHERE NAME LIKE concat('%', concat( '小', '%' ))

查询结果如下:
image20220401095150k99d6bm.png

那么如果将'小'换成 % 呢?
image20220401095234xpqfyxt.png

再换成'_'呢?
image202204010953351bh750x.png

没错,它会查询出所有数据,说来惭愧,这也是我一个 5 年 Java 开发程序员才注意到的事情!!!GOD

问题出现了就要解决它,有大佬推荐说 MySQL 可以使用 ngram 进行分词,我不知道是啥也没用过,而且我用的数据库是 Oracle

不过我找到了另外一种既可以在 Oracle 用的也可以在 MySQL 用的解决办法:

  • 首先我们在代码中进行字符串替换:
String name = user.getUserName();
if(null!=name && !"".equals(name)){
    user.setName(name.replaceAll("\\%","\\\\%").replaceAll("\\_","\\\\_"));
}
  • 然后修改查询 sql:
    image20220401100349auqjxex.png

为什么图中用的 @?因为 MySQL 用\会报错,只能用两个斜杠\ \ ,但是在 Oracle 中是可以只用一个\的。好吧,问题就是这么解决掉啦,再小的功能也有可能翻车,哎,写代码得格外小心呀。


标题:模糊查询输入%和_会查询全部的问题
作者:cuijianzhe
地址:https://cuijianzhe.github.io/articles/2022/04/01/1648780777601.html