一位同事在使用SQL处理一串字符时,出现一个意料之外的问题:这个字符串中包括字符‘&’。我们先看一下现象:
 
 
SQL> select * from v$version;
 
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
 
SQL> select substr('asdf&yuechaotian', 1, 1) from dual;
输入 yuechaotian 的值:
原值    1: select substr('asdf&yuechaotian', 1, 1) from dual
新值    1: select substr('asdf', 1, 1) from dual
 
 
S
-
a
 
因为这里的&提示后面的字符串是一个变量,提示我输入子串yuechaotian的值。直接输入回车后,这个字符串就变成'asdf',进行substr操作。比如此时我取第5个字符,就会返回null了:
 
 
SQL> select substr('asdf&yuechaotian', 5, 1) from dual;
输入 yuechaotian 的值:
原值    1: select substr('asdf&yuechaotian', 5, 1) from dual
新值    1: select substr('asdf', 5, 1) from dual
 
 
S
-
 
 
此时只要将字符‘&’转义一下就好。转义字符是由SQL*PLUS的参数escape来控制的:
 
 
-- 默认情况下,escape是关闭的
SQL> show escape
escape OFF
-- 打开escape,默认使用'\'作为转义字符
SQL> set escape on
SQL> show escape
escape "\" (hex 5c)
-- 此时使用'\'将字符'&'转义
SQL> select substr('asdf\&yuechaotian', 1, 1) from dual;
 
 
S
-
a
 
-- 转义字符只是用来转义,本身是不占字符位置的
SQL> select substr('asdf\&yuechaotian', 5, 1) from dual;
 
 
S
-
&
 
转义字符只转义它后面的一个字符:
 
 
-- 此时第一个'\'将第二个'\'转义,&表示后面的子串yuechaotian是变量,不输入任何值,得到子串'asdf\'
SQL> select substr('asdf\\&yuechaotian', 5, 1) from dual;
输入 yuechaotian 的值:
原值    1: select substr('asdf\\&yuechaotian', 5, 1) from dual
新值    1: select substr('asdf\', 5, 1) from dual
 
 
S
-
\
 
 
-- 此时第一个'\'将第二个'\'转义,第三个'\'将'&'转义,得到子串'asdf\&yuechaotian'
SQL> select substr('asdf\\\&yuechaotian', 5, 1) from dual;
 
 
S
-
\
 
SQL> select substr('asdf\\\&yuechaotian', 5) from dual;
 
 
SUBSTR('ASDF\
-------------
\&yuechaotian
 
其实你也可以自己制定转义字符,不一定要使用'\'。比如你的字符串里本身就有字符'\',你需要找一个特殊点的字符作为转义字符:
 
 
SQL> set escape #
SQL> show escape
escape "#" (hex 23)
SQL> select substr('asdf\\\#&yuechaotian', 5) from dual;
 
 
SUBSTR('ASDF\\\
---------------
\\\&yuechaotian
 
 
http://blog.chinaunix.net/uid-298599-id-2443124.html

转 SQL - 字符串中的转义字符的更多相关文章

  1. MyBatis Sql语句中的转义字符

    1.在xml的sql语句中,不能直接用大于号.小于号要用转义字符 如果用小于号会报错误如下: org.apache.ibatis.builder.BuilderException: Error cre ...

  2. java中如何忽略字符串中的转义字符--转载

    原文地址:http://my.oschina.net/u/1010578/blog/366252 起因     这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是js ...

  3. SQL查询中的转义字符

    转载自http://blog.csdn.net/Adi_liu/archive/2007/12/06/1920606.aspx   如果想查找“_cs”结尾的的账户 select * from [us ...

  4. C# 过滤SQL 字符串中的 参数

    /// <summary> /// 参数过滤 /// </summary> /// <param name="parameters"></ ...

  5. SQL*PLUS中批量执行SQL语句

    SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...

  6. C#格式化字符串中转义大括号“{}”

    原文:C#格式化字符串中转义大括号"{}" 今天,用C#写程序操作Excel,读取单元格内容根据所需格式生成字符串,使用String.Format(string format,ob ...

  7. 如何去掉C#字符串中的所有空格(转载)

    如何去掉C#字符串中的所有空格 来源:https://www.cnblogs.com/donchen/p/8966059.html 字符串行数Trim()可以去掉字符串前后的空格,如:  C# Cod ...

  8. 如何去掉C#字符串中的所有空格

    字符串行数Trim()可以去掉字符串前后的空格,如:  C# Code  string myString = " this is a test "; Console.WriteLi ...

  9. string.format格式化字符串中转义大括号“{}”

    今天,用Java读取配置文件占位符,使用String.Format(string format,object arg0)方法.以前只知“{0}”为索引占位符(即格式项),与参数列表中的第一个对象相对应 ...

随机推荐

  1. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

  2. Hdfs的ACL測试

    Hadoop从2.4.0版本号開始支持hdfs的ACL,在CDH5.0其中也集成了该特性,以下对其进行一些測试: unnamed user (file owner) 文件的拥有者 unnamed gr ...

  3. HDU 5405 Sometimes Naive 树链剖分+bit*****

    Sometimes Naive Problem Description   Rhason Cheung had a naive problem, and asked Teacher Mai for h ...

  4. 代理ip proxy

    import requestsimport timefrom selenium import webdriverfrom selenium.webdriver.chrome.options impor ...

  5. IDE配置jvm参数

    -------- IntelliJ IDEA 配置参数:-Xms34m -Xmx234m 内存初始化大小,最小和最大值: 测试代码: public class JVMDemoTest { public ...

  6. Lightoj 1016 - Brush (II)

    After the long contest, Samee returned home and got angry after seeing his room dusty. Who likes to ...

  7. YTU 2952: A代码填充--谁挡住了我

    2952: A代码填充--谁挡住了我 时间限制: 1 Sec  内存限制: 128 MB 提交: 135  解决: 38 题目描述 n个人前后站成一列,对于队列中的任意一个人,如果排在他前面的人的身高 ...

  8. SPFA 算法详解( 强大图解,不会都难!) (转)

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便 派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径 ...

  9. EF3:Entity Framework三种开发模式实现数据访问

    前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...

  10. mongoDB 安全权限访问控制

    MongoDB3.0权限 https://blog.csdn.net/leonzhouwei/article/details/46564141 转自:http://ibruce.info/2015/0 ...