Java mysql 处理特殊字符% _

sql中经常用like进行模糊查询,而模糊查询就要用到百分号“%”,下划线“_”这些通配符,其中“%”匹配任意多个字符,“_”匹配单个字符。如果我们想要模糊查询带有通配符的字符串,如“60%”,“user_name”,就需要对通配符进行转义,有两种方式。如下:

1、反斜杠是转义符,通过反斜杠来转义%,使其不再是通配符。这里第一个%是通配符,第二个%不是通配符。

  select percent from score where percent like '%0\%'; 

2、这种是通过escape关键字进行转义,将特定符号后的字符进行转义,这里斜杠后面的%就不再是通配符,斜杠之前的%仍然起通配符作用。

select percent from score where percent like '%0/%' escape '/'; 

上面的这些事mysql语句的处理,可是如果我们在Java代码中,如何将传入的参数处理成上面的形式呢?

比如我们需要查询name like "我是%强" 这样的形式:即Mybatis类似这样"我是%强"需要作为参数name传入:

where name like concat('%', #{name}, '%');。 

直接将name="我是%强"传入是不行的,sql语句变成 where name like '%我是%强%'。这样会找到类似name为:"我是%强","我是强","我是asdf强"……因为“%”匹配任意多个字符。

方法一:

所以我们就需要在Java中对"我是%强"中的%进行转义,转成:"我是\%强"这样的形式(即上面的第一点)。

所以Java处理方法如下:

name = "我是%强";

name = name.replaceAll("%", "\\\\%");

没错,需要用四个反斜杆去处理,最后获取到的name就是"我是\%强"。这个在sql中就可以直接使用了。

原理:在java 单独在字符串中使用"\"转义字符是会报错的(除非有特殊含义入:\n,\r)。Java中 "\\" 代表"\", 所以要获取"\%"这样的字符串,就需要用两个反斜杆处理,即"\\%"在Java中表示"\%"。可是,要替换字符串中的%又要用到正则去转义也需要用"\\%"。因此最终要得到"\%" 就必须要四个"\"。其中经过第一次java转义获得"我是\\%强",第二次正则转义获得"我是\%强"。

上面是处理%号的,下划线的处理原理与上面的相同。

方法二:

其实网上也有在Java中结合上面的第二种方法进行处理。即

name = "我是%强";

name = name.replaceAll("%", "/%");

但是这种需要每条用了like的sql语句都添加"escape '/'", 这样太麻烦了。所以推荐使用方法一的方式进行处理。

关注公众号获取更多内容,有问题也可在公众号提问哦:

 

强哥叨逼叨

叨逼叨编程、互联网的见解和新鲜事

 

你可能感兴趣的:(java,mysql)