最近在写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. Discuz! x 2.5-3.0 beta 存储型跨站漏洞

    漏洞版本: Discuz x 2.5 - 3.0 漏洞描述: Discuz! 已拥有11年以上的应用历史和200多万网站用户案例 是全球成熟度最高.覆盖率最大的论坛软件系统之一,淘帖处发表评论,直接插 ...

  2. jboss项目迁移至WebLogic12

    1 weblogic 使用jtds-1.2.3.jar驱动链接MS SQL Server 2008的数据源配置 1.1 拷贝jtds-1.2.3.jar至D:\Oracle\Middleware\wl ...

  3. Http 状态码完整说明

    在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样, 一些常见的状态码为: 200 - 服务器成功返 ...

  4. EXP-00056: ORACLE error 6550 encountered报错;

    SQL> exp sys/sys file=/home/oracle/sys.dmp full=y Export: Release 11.2.0.3.0 - Production on Wed ...

  5. 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]

    原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...

  6. [ZETCODE]wxWidgets教程六:事件处理

    本教程原文链接:http://zetcode.com/gui/wxwidgets/events/ 翻译:瓶哥 日期:2013年12月7号星期六 邮箱:414236069@qq.com 主页:http: ...

  7. 解决windows10搜索不到内容的问题

    windows 10的搜索突然搜不到程序了, 网上查询说要重建索引,方法如下: 1.按ctr+R键,输入%LocalAppData%\Packages\windows.immersivecontrol ...

  8. 5 weekend01、02、03、04、05、06、07的分布式集群的HA测试 + hdfs--动态增加节点和副本数量管理 + HA的java api访问要点

    weekend01.02.03.04.05.06.07的分布式集群的HA测试 1)  weekend01.02的hdfs的HA测试 2)  weekend03.04的yarn的HA测试 1)  wee ...

  9. 上海Uber优步司机奖励政策(2月1日~2月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. php 链接access数据库

    php链接access数据库代码 <?php $odbc = "Driver={Microsoft Access Driver (*.mdb)};Dbq=".realpath ...