最近在写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会自动将单个单引号转换成两个的,赋值时不必写两个单引号
 
 

Oracle 特殊字符模糊查询的方法的更多相关文章

  1. SQL中对日期进行模糊查询的方法

    在我们通过SQL语句对数据库中的数据进行查询时,难免会遇到针对datetime的查询,但是因为一般情况下,输入的时间条件为年月日,所以,这种情况下,我们就要进行一下模糊查询,首先,摒弃一种投机取巧的方 ...

  2. ORACLE跨数据库查询的方法

    原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ...

  3. oracle like模糊查询

    简单的方式,使用"%" 和 "_" 字符匹配操作可以使用通配符 "%" 和 "_": %:表示任意个字符,包括零个: _ ...

  4. LinqToEntity模糊查询的方法选择

    LinqToEntity针对oracle模糊查询 方法:Contains() 转换出来的sql是  like  关键字 方法:IndexOf()  转换出来的sql是  instr()  函数 lik ...

  5. 支持Oracle的模糊查询和精准查询

    相信所有的软件开发者都做过页面上的查询功能,而且很多都需要既支持模糊查询的,也需要支持精准查询的,而且不需要增加多余的功能,只需要在文本框中输入包含类似*之类的符号即可. 下面的方法就是通过*来判断到 ...

  6. MySQL单表多字段模糊查询解决方法 又折磨半天concat(字段不能为空,如为空则用IFNULL(字段,'');

    SELECT `id`,`weixin_id`,`user_name`,`sex`,`area_id`,`address_near`,`phone`,`create_time`,`import_use ...

  7. oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. MySQL单表多字段模糊查询解决方法

    例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍.然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查 ...

  9. oracle like模糊查询不能走索引?

    这里要纠正一个网上很多教程说的模糊匹配不能走索引的说法,因为在看<收获,不止SQL优化>一书,里面举例说到了,并且自己也跟着例子实践了一下,确实like一些特殊情况也是可以走索引的 例子来 ...

随机推荐

  1. vs2010自带的报表

    本例用来显示Northwind中的order details表中的数据交分组 1.建立一WinForm程序,并建立一数据库连接,选择order details表,此时会自动建立一个xsd的数据集类,如 ...

  2. Exporter - 实现默认的导入方法用于模块

    Exporter - 实现默认的导入方法用于模块 简介: In module YourModule.pm: package YourModule; require Exporter; @ISA = q ...

  3. 【转】android-support-v7-appcompat.jar 的安装及相关问题解决 --- 汇总整理

    原文网址:http://tdppro.blog.51cto.com/749956/1388853 1.DownLoading the Support Libraries 1)Start the And ...

  4. win8 mysqlzip install

    1. 下载MySQL Community Server 5.6.142. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下.3. 添加环境变量 变量名:MYSQL_HOME 变量值: ...

  5. java中Pattern.compile函数的相关解释

    Pattern.compile函数:Pattern Pattern.compile(String regex, int flag) flag的取值范围如下: Pattern.CANON_EQ,当且仅当 ...

  6. MD5Helper辅助类

    DES加密和解密 public class MD5Helper { ///DES加密 ///sKey public string MD5Encrypt(string pToEncrypt, strin ...

  7. 《C语言程序设计现代方法》第2章 C语言基本概念

    C语言的基本概念 第一个C程序例子. /* pun.c */ #include <stdio.h> int main(void) { printf("To C, or not t ...

  8. chapter3:Collaborative Filtering ---------A Programmer's Guide to Data Mining

    Implicit rating and item based filtering Explicit rating: 用户明确的对item评分 Implicit rating:反之 明确评分所存在的问题 ...

  9. vim spf13

    效果图来一个: http://vim.spf13.com/ 这个网站里面的vim配置非常全,推荐. 下面是对这个vim快捷键总结: <Leader> 是"," 打卡一个 ...

  10. 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!

    我以为我会是最坚强的那一个 我还是高估了自己 我以为你会是最无情的那一个 还是我贬低了自己 就算不能够在一起 我还是为你担心 就算你可能听不清 也代表我的心意 那北极星的眼泪 闪过你曾经的眼角迷离 那 ...