Oracle中字符串轉義問題總結

字符串like匹配遇到關鍵字,字符轉義問題

在使用like匹配字符串的時候,如果字符串中有%、下劃線、單引號等sql語法中保留字符串,這時候需要轉義,mysql中保持和linux或某些編程語言中一致,使用反斜槓“\”來解決,Oracle中則稍顯麻煩。

前面說過,在字符串拼接時遇到關鍵字可用quote(q)方法來搞定,但在where條件的like匹配中,就需要使用escape來搞定。

escape用法說明:

1)使用 ESCAPE 關鍵字定義轉義符。在模式中,當轉義符置於通配符之前時,該通配符就解釋爲普通字符。

2)ESCAPE 'escape_character’允許在字符串中搜索通配符而不是將其作爲通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。

造測試數據

set define off
create table test (c_text varchar2(20));
insert into test(c_text) values ('sdd_kk');
insert into test(c_text) values ('d''d');
insert into test(c_text) values ('dfsfsa');
insert into test(c_text) values ('dffa%asfs');
insert into test(c_text) values ('12345');
insert into test(c_text) values ('1%2345');
insert into test(c_text) values ('1%54321');
insert into test(c_text) values ('2%54321');
insert into test(c_text) values ('%%54321');
insert into test(c_text) values ('A&B');
commit;
set define on

輸出結果:

SYS@orcl11g>select * from test;

C_TEXT
--------------------
sdd_kk
d'd
dfsfsa
dffa%asfs
12345
1%2345
1%54321
2%54321
%%54321
A&B

10 rows selected.
  • 如何插入帶單引號的值,比如:d’d

oracle中使用insert into test(c_text) values (‘d’‘d’);

mysql中使用insert into test(c_text) values (‘d\d’);

  • 如何插入“&”這個字符,比如:A&B

方法一: 通用,推薦

SYS@orcl11g>select ascii('&') from dual;

ASCII('&')
----------
        38

SYS@orcl11g>insert into test(c_text) values (chr(38));

1 row created.

SYS@orcl11g>select * from test where c_text like '%'||chr(38)||'%';

C_TEXT
--------------------
A&B
&

方法二: 在sqlplus中關閉“&”字符特殊含義的定義

SQL> show define
 
define "&" (hex 26)
 
SQL> set define off
 
SQL> show define
 
define OFF
 
SQL> insert into test values('test&test');

轉義字符例子

  • 轉義字符爲’ '(空格);
SYS@orcl11g>select * from test where c_text like 'sdd _%' escape ' ';

C_TEXT
--------------------
sdd_kk
  • 轉義字符爲’’
SYS@orcl11g>select * from test where c_text like 'sdd\_%' escape '\';

C_TEXT
--------------------
sdd_kk
  • 轉義字符爲’=’
SYS@orcl11g> select * from test where c_text like 'sdd=_%' escape '=';

C_TEXT
--------------------
sdd_kk
  • 轉義字符爲’/’
SYS@orcl11g> select * from test where c_text like 'sdd/_%' escape '/';

C_TEXT
--------------------
sdd_kk
  • 轉義字符爲d,沒有實現轉義功能,其他不包含在條件中的字母可以
SYS@orcl11g>select * from test where c_text like 'sddd_%' escape 'd';

no rows selected

SYS@orcl11g>select * from test where c_text like 'sddc_%' escape 'c';

C_TEXT
--------------------
sdd_kk
SYS@orcl11g>select * from test where c_text like 'sdds_%' escape 's';
select * from test where c_text like 'sdds_%' escape 's'
                                     *
ERROR at line 1:
ORA-01424: missing or illegal character following the escape character

查詢包含語法關鍵字的字段值

  • 查找包含所有’_'的字段
SYS@orcl11g>select * from test where c_text like '%\_%' escape '\';

C_TEXT
--------------------
sdd_kk
  • 查找含有’%'的所有值

SYS@orcl11g>select * from test where c_text like '%\%%' escape '\';

C_TEXT
--------------------
dffa%asfs
1%2345
1%54321
2%54321
%%54321
  • 查詢包含“&”字符的內容

如果直接使用上面介紹的方法會報錯:

SYS@orcl11g>select * from test where c_text like '%\&%' escape'\';
select * from test where c_text like '%\&%' escape'\'
                                     *
ERROR at line 1:
ORA-01424: missing or illegal character following the escape character

使用對應的ASCII碼去匹配纔可以:

SYS@orcl11g> select * from test where c_text like '%'||chr(38)||'%';

C_TEXT
--------------------
A&B
  • 查找含有單引號的值
SYS@orcl11g>select * from test where c_text like '%''%';

C_TEXT
--------------------
d'd
  • 有關單引號的特殊情況

情況一:

SYS@orcl11g>SELECT 'ORACLE'||'''' FROM DUAL;

'ORACLE
-------
ORACLE'

情況二:

SYS@orcl11g>SELECT 'ORACLE''''' FROM DUAL;

'ORACLE'
--------
ORACLE''

對於情況一,前兩個單引號配對,後面四個單引號表示單引號這個字符串。

對於情況二,總共6個單引號,第1、6單引號表示字符串表達用的開頭結尾單引號,第2個單引號表示轉義符號(因轉義犧牲掉),第3個單引號表達出原值(保留),第4個單引號也表示轉義,第5個單引號表達出原值。所以,最後結果出現兩個單引號。

對比’ORACLE’||’’’'的情況,Oracle字符串在使用||拼接的時候,||前後都是一個字符串,寫sql的時候要特別注意。

字符拼接問題

方法一:推薦

一般在拼接字符串時,‘A’||'B’簡單情況是可以的,但是如果包含單引號這樣的關鍵字就會報語法錯誤了,使用Quote(q)語法就可以搞定,好處如下:

a.指定自己的引號分隔符

b.可選擇任意方便的分隔符,單字節或多字節,或者下列符號: [ ], { }, ( ), < >。

c.增加可讀性和可用性

舉例:

SQL> select department_name || q'[, it's assigned Manager Id: ]' || manager_id as "Department and Manager" from departments;
Department and Manager
-----------------------------------------------------------------------
Administration, it's assigned Manager Id: 200
Marketing, it's assigned Manager Id: 201
Purchasing, it's assigned Manager Id: 114

方法二: 處理單引號

由於單引號是匹配字符串的關鍵字符,所以oracle中使用兩個單引號來表示。字符串兩端又需要單引號,最終,爲了輸入一個單引號,需要4個單引號來完成,即:’’’’ ,這也就是爲啥使用quote(q)方便的原因。

SYS@orcl11g>select '''' as danyinhao from dual;

D
-
'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章