Oracle 特殊字符模糊查询的方法
最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据。
这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询。
首先理解一下什么是特殊字符。
在ascii码表中,特殊字符的范围如下。即从32~47 58~64 91~96 123~126。
模糊查询时,有两种方法可以进行转换。
1. 使用REGEXP_LIKE方法,这是个使用正则表达式来查询的方法,因此有此字符需要进行转义才能查询,如$ *等,转义符为反斜杠\,因此反斜杠也要进行转。这里只讨论字符中包含某字符串的情况,对于正则表达式的匹配不作讨论。
2. 使用like关键字,配合escape关键字进行转义。
字符匹配操作可以使用通配符 “%” 和 “_”:
%:表示任意个字符,包括零个;
_:表示一个任意字符;上文说到输入下划线会查出所有就是因为只要有任意一个字符都可以查询出来。
同时,对于单引号,在oracle中,例如select * from tableTest t where t.name like '%'%' escape '\' 那么like语句中的'会与前一个单引号匹配,造成语法错误。使用转义符号也无法正常结束。需要将单个单引号转成两个单引号,select * from tableTest t where t.name like '%''%' escape '\'
因此,上面两个字符,以及用来转义的字符(通常使用反斜杠)需要进行转义。


那么问题又来了,在Java代码中,如果使用JDBC的PreparedStatement进行预编译,是不是就可以不需要进行转义了?
just do it!
答案是否定的,还是需要进行转义。注意下面,没有进行转义,查出的结果仍然是所有记录。

转义后就精确了。

还应注意两点:
1. jdbc会自动加上单引号,赋值时不必添加单引号
2. jdbc会自动将单个单引号转换成两个的,赋值时不必写两个单引号

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!