一位同事在使用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. 每天一个JavaScript实例-获取元素当前高度

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. 各项异性滤波简单介绍Anisotropic Filtering(AF)

    本文主要整理简绍来自互联网的各项异性滤波的知识. 原文链接:http://www.linuxgraphics.cn/graphics/using_anisotropic_texture_filteri ...

  3. CentOS 使用httpd 配置局域网 yum源

    1.上传centos iso而且挂载 mkdir /mnt/cdr/iso mount -o /xxx.iso /mnt/cdr 2.使用createrepo来创建repo文件 cd /mnt/cdr ...

  4. 【Mongodb教程 第十一课 】MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  5. WPF 创建二维码

    1.在http://zxingnet.codeplex.com/网站上下载ZXing .Net的第三方库 2.新建一个WPFproject 3.引入zxing.dll 4.加入引用空间 using Z ...

  6. Mac下Git项目使用的.gitignore文件

    https://www.gitignore.io/ 这个网站可以搜索特定项目.系统所需要的.gitignore 我现在主要是在Mac上用Visual Studio Code进行开发,所以直接搜索Mac ...

  7. oracle 12c的数据库导进 11g

    从oracle 12c 备份(expdp)出来的包,还原到11g里,想想都知道会有兼容性问题. 果不其然,报错了: ORA-39142: 版本号 4.1 (在转储文件 "叉叉叉.expdp& ...

  8. jquery获取兄弟元素

    按照w3c school的指引,jquery中,要获得一个元素的兄弟,可以用 prev().next()两种方法.顾名思义,prev()获得前一个,next()获得后面一个. 问题是,如果存在前后兄弟 ...

  9. c/c++内存使用原则

    1 no malloc no free 2 no new no delete 如果对象不是new出来的,那么这个对象在生命周期结束后会自动调用析构函数自己释放自己的内存,不需要delete. 但是如果 ...

  10. 滑动窗体的最大值(STL的应用+剑指offer)

    滑动窗体的最大值 參与人数:767时间限制:1秒空间限制:32768K 通过比例:21.61% 最佳记录:0 ms|8552K(来自 ) 题目描写叙述 给定一个数组和滑动窗体的大小.找出全部滑动窗体里 ...