现在的位置: 首页 > 综合 > 正文

Oralce的转义字符

2018年05月11日 ⁄ 综合 ⁄ 共 2080字 ⁄ 字号 评论关闭

Oracle中对一些特殊字符处理的时候,需要进行转义。
特殊字符包括:
% 在Oracle中用来匹配0到多个字符。
_ 在Oracle中用来匹配1个字符。
&  在Oracle中用来作输入提示符。
\   默认的转义字符。
' 单引号用来括起字符串,所以如果字符串中有',必须用两个连续的'来代替。

首先来看看如果SQL文中包括特殊字符&的时候怎么处理。
有4种办法:
1) 先执行set define off关闭&的输入提示作用,之后再执行set define on恢复。
2) 先执行set escape on打开'\'的转义作用(默认关闭),然后在需要输入&的地方用\&代替。
   之后再执行set escape off恢复。
3) 使用字符串拼接。例如 'abc'||'&'||'def',单个的&,Oracle不会把它当作输入提示符。
4) 使用set define 把输入提示符换掉。例如set define :
5) 使用chr函数转换&的ASCII码38为字符,例如 'abc'||chr(38)||'def'

再来看看\,前面说了执行set escape on打开'\'的转义作用,执行set escape off关闭。
所以如果转义打开的时候,需要输入\的地方需要用\\来代替,否则直接输入。

tony@ORA11GR2> create table t(txt varchar2(64));

表已创建。

tony@ORA11GR2> show define
define "&" (hex 26)
tony@ORA11GR2> show escape
escape "\" (hex 5c)
tony@ORA11GR2> insert into t values('abc%def');
已创建 1 行。
tony@ORA11GR2> insert into t values('abc_def');
已创建 1 行。
tony@ORA11GR2> set define off;
tony@ORA11GR2> insert into t values('abc&def');
已创建 1 行。
tony@ORA11GR2> set define on;
tony@ORA11GR2> set escape on;
tony@ORA11GR2> insert into t values('abc\&1def');
已创建 1 行。
tony@ORA11GR2> insert into t values('abc\\def');
已创建 1 行。
tony@ORA11GR2> set escape off
tony@ORA11GR2> insert into t values('abc' || '&' || '2def');
已创建 1 行。
tony@ORA11GR2> insert into t values('abc\1def');
已创建 1 行。
tony@ORA11GR2> insert into t values('abc123def');
已创建 1 行。
tony@ORA11GR2> insert into t values('abc''def');
已创建 1 行。
tony@ORA11GR2> select * from t;

TXT
--------------------
abc%def
abc_def
abc&def
abc&1def
abc\def
abc&2def
abc\1def
abc123def
abc'def

现在来看看查询时候的处理:

tony@ORA11GR2> select * from t where txt like 'abc\%def' escape '\';
TXT
--------------------
abc%def

tony@ORA11GR2> select * from t where txt like 'abc\_def' escape '\';
TXT
--------------------
abc_def

tony@ORA11GR2> --'&'不能通过转义字符查找
tony@ORA11GR2> set define off;
tony@ORA11GR2> select * from t where txt like 'abc&def';
TXT
--------------------
abc&def

tony@ORA11GR2> set define on;
tony@ORA11GR2> select * from t where txt like ('abc' || '&' || '1def');
TXT
--------------------
abc&1def

tony@ORA11GR2> select * from t where txt like ('abc''def');
TXT
--------------------
abc'def

替换输入提示符:

scott@ORA11GR2> select &a from dual;
Enter value for a: 1
old   1: select &a from dual
new   1: select 1 from dual

         1
----------
         1

scott@ORA11GR2> set define :
scott@ORA11GR2> select :a from dual;
Enter value for a: 1
old   1: select :a from dual
new   1: select 1 from dual

         1
----------
         1

 

抱歉!评论已关闭.