Java查询Mysql数据库时,查询条件带特殊字符(\ % ‘ * _)的处理方式

这篇博客探讨了在Java中处理包含特殊字符(如 % ' * _)的查询时的问题,特别是如何在Mysql数据库查询中正确处理反斜线。文章详细解释了Java字符串、正则表达式和Mysql查询中的反斜线转义,并通过实例展示了精确查询和模糊查询的不同情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴上公共方法

    public static String replaceStr(String str) {
        if(str != null && !"".equals(str)) {
            str = str.replaceAll("\\\\", "\\\\\\\\")
                    .replace("_", "\\_").replace("\'", "\\'")
                    .replace("%", "\\%").replace("*", "\\*");

        }
        return str;
    }

对于 _ ’ % * 这些特殊字符,好理解,那为什么 \ 就不同呢?

一. 知识储备

1. 在Java中使用反斜线\

如果想用字符串表示一个反斜线,则需要使用"\"。直接使用""会报错。
在这里插入图片描述
原因在于: java编译器会误以为\是用来转义后面跟着的"符号。

2. 在正则表达式中使用反斜线\

首先,目标字符串中的 “\\” 会被编译器解析成 “\” ,接着,作为正则表达式,又会将"\“当做转义符,把表达式内的”\\“转义成”\"。

所以在正则表达式中如果想匹配"\"(一个反斜线),必须使用"\\\\"(四个反斜线)。

转换过程: “\\\\” -> “\\” -> “\”

3. 在Mysql中查询带有反斜线\的字符串

Mysql中,默认不启用NO_BACKSLASH_ESCAPES述 模式,也即会将"“作为转义字符而不是一个普通字符来解析。
下方是Mysql8.0的参考文档: Mysql8.0 doc
在这里插入图片描述
官方告知我们,”\"会将转义表中出现的字符进行转义,但对于那些没有在转义表中字符,反斜线会在解析时被忽略。(我用红色的线勾出来了)

回过头来看看"\",其中前两个"\“反斜线会被解析成”",但大家注意到,现在还剩下一个""反斜线呢,它后面没有跟任何字符,因此在解析时会被忽略!
再来看看Mysql在查询中对"“的解析,Mysql中精确查询和模糊查询对”"的解析稍有差别。

比如现在有一张表 country,有字段 id 和name

在这里插入图片描述
1. 精确查询

只需要对目标字符串内"\"当作转义符进行一次解析即可。

查询语句1: select * from country where name=“中\国”;

由于与"“相连的字符不在转义表内,因此”“将被忽略,实际查询的结果为"中国”。
在这里插入图片描述
查询语句2: select * from country where name=“中\\国”;

由于"\\“在转义表内,可以被解析成”\",因此实际查询的结果为"中\国"。
在这里插入图片描述
查询语句3: select * from country where name=“中\\\国”;

由于"\\“在转义表内,可以前两个右斜线被解析成”\",但第三个右斜线孤立一人,后面没有跟任何字符,不在转义表中,会被忽略。因此实际查询的结果为"中\国"。
在这里插入图片描述
2. 模糊查询
经历了两次解析过程,“编译器解析"和"正则表达式解析”。

查询语句1: select * from country where name like ‘中\\国’;

经过"编译器解析"后, “中\\国” 被解析为"中\国",接着经过"正则表达式解析"后,“中\国"解析为"中国”。

在这里插入图片描述

查询语句2: select * from country where name like ‘中\\\国’;

经过"编译器解析"后,“中\\\国"被解析为"中\国”,接着经过"正则表达式解析"后,“中\国"解析为"中国”。
在这里插入图片描述
查询语句3: select * from country where name like ‘中\\\国’;

经过"编译器解析"后,“中\\\国"被解析为"中\\国”,接着经过"正则表达式解析"后,“中\\国"解析为"中\国”。所以实际的模糊查询结果为"中\国"。

在这里插入图片描述
在这里插入图片描述
查询语句4: select * from country where name like ‘中\\\\\国’;

经过编译器解析后,“中\\\\\国"被解析成"中\\国”,接着经过"正则表达式解析"后,“中\\国"解析为"中\国”。所以实际的模糊查询结果为"中\国"。
在这里插入图片描述
在这里插入图片描述

二. 应用

以Spring boot starter web为例,当controller层接收到含有一条反斜线的属性(或字符串)参数后,会像下图所示:
在这里插入图片描述
但实际上如果我们写测试用例模拟时,此处等价于 在这里插入图片描述

此处,我对该参数做了模糊查询,因此按照如下写法:

scheduleEventVO.setDescription(scheduleEventVO.getDescription().replaceAll("\\\\", "\\\\\\\\"));
                criteria.andLike("description", StringUtils.stringLike(scheduleEventVO.getDescription()));
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值