Oracle特殊字符模糊查询的⽅法
最近在写DAO层的时候,遇到⼀个问题,就是使⽤like进⾏模糊查询时,输⼊下划线,⽆法精确查到数据,⽽是返回所有的数据。
这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进⾏转义才可以进⾏查询。
⾸先理解⼀下什么是特殊字符。
在ascii码表中,特殊字符的范围如下。即从32~47 58~64 91~96 123~126。
regexp like模糊查询时,有两种⽅法可以进⾏转换。
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会⾃动将单个单引号转换成两个的,赋值时不必写两个单引号

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。