ORACLE逸出字元的那點事

來源:互聯網
上載者:User

標籤:

在oracle中,某些字元表示的有特殊的含義的,比如說&符號,表示變數替換;%表示在查詢過程中的萬用字元

下面列出一些在ORACLE中有特殊含義的字元作以測試:

符號

功能

類型

%

在where子句中表示0到任意個字元

萬用字元

_

在where子句中表示確切的未知字元

萬用字元

?

在where子句中表示確切的位置字元

萬用字元

#

在where子句中確切的阿拉伯數字

萬用字元

[a-d]

表示字元範圍

萬用字元

表示文本、字元和日期

定界符

"

將包含特定字元或者空格的列別名括起來

定界符

&

用來指出一個變數

特殊符號

||

字串串連

特殊符號

*

在select語句中表示0個或者多個列

特殊符號

/

終止SQL語句

特殊符號

 

注釋

注釋符

(註:經過測試,上面的3、4、5條通配,不靠譜,誤信)

這裡列出了常用的一些特殊符號,在這裡我們對其進行insert(這裡直接寫那些能夠insert成功的語句了),一下語句安裝表中出現的先後順序出現:

SQL> create table test (name varchar2(20));

SQL> insert into test values(‘abc3‘);

SQL> insert into test values(‘abc_123‘);

SQL> insert into test values(‘abc?123‘);

SQL> insert into test values(‘abc#123‘);

SQL> insert into test values(‘abc[a-d]123‘);

SQL> insert into test values(‘abc‘‘123‘);

SQL> insert into test values(‘abc"123‘);

SQL> insert into test values(‘abc‘ || chr(38) || ‘123‘);

SQL> insert into test values(‘abc||123‘);

SQL> insert into test values(‘abc*123‘);

SQL> insert into test values(‘abc/123‘);

SQL> insert into test values(‘abc123‘);

SQL> select * from test;

NAME

--------------------

abc3

abc_123

abc?123

abc#123

abc[a-d]123

abc‘123

abc"123

abc&123

abc||123

abc*123

abc/123

abc123

可以看到在上面的insert操作中,除了單引號(‘)在字串中出現需要兩個重複之外,還有一個特例就是and符號(&),這裡是用了ascii轉碼的方式來做的,關於ascii碼可以用這個方式來查詢:

SQL> select ascii(‘&‘) from dual;

ASCII(‘&‘)

----------

        38

既然將這個&拿出來了,我們就單獨對它說說,

上面的那種方式適用於SQL指令碼中,大量SQL中有&符號的話,可以用轉碼方式實現,如果你是在SQL*Plus中,還可以這麼做:

SQL> insert into test values(‘abc&test123‘);

Enter value for test123: &123

old   1: insert into test values(‘abc&test123‘)

new   1: insert into test values(‘abc&123‘)

雖然這麼做也可以實現,但是違背了我們的意圖

另外一種(使用逸出字元):

SQL> show escape

escape OFF

SQL> set escape on

SQL> insert into test values(‘abc\&123‘);

1 row created.

或者(直接把define功能關閉):

SQL> show define

define "&" (hex 26)

SQL> set define off

SQL> show define

define OFF

SQL> insert into test values(‘abc&123‘);

1 row created.

 

現在表中的資料如下:

SQL> select * from test;

NAME

--------------------

abc3

abc_123

abc?123

abc[a-d]123

abc‘123

abc"123

abc&123

abc||123

abc*123

abc/123

abc123

abc#123

abc&123

abc&123

abc&123

abc3

 

接下來,說下select那些事:

由於前幾個字元是出現在where子句中才生效的,所以前面幾條用where子句來進行測試(和上面一樣,這裡還是直接寫測試成功的句子):

SQL> select * from test where name like ‘abc\3‘ escape ‘\‘;

NAME

--------------------

abc3

abc3

可以看到在這裡,我們指定了escape逸出字元標識,當然這裡的正斜杠可以是其他的字元,例如:

SQL> select * from test where name like ‘abc=3‘ escape ‘=‘;

NAME

--------------------

abc3

abc3

OK,道理說明白了,其他的字元就不一一的列舉,在此只列出兩個比較特殊的例子,分別是單引號和and符號

單引號:

這裡你可以使用連寫兩個的方式進行轉換:

SQL> select * from test where name like ‘abc‘‘123‘;

NAME

--------------------

abc‘123

但是,當你試圖對其進行轉義的時候,你會發現,報錯了(引用字串為正常結束,哦,好吧,看來單引號是需要特殊對待的):

SQL> select * from test where name like ‘abc\‘123‘ escape ‘\‘;

ERROR:

ORA-01756: quoted string not properly terminated

 

&and字元:

SQL> select * from test where name like ‘abc\&123‘ escape ‘\‘;

Enter value for 123: &

可以看到,如果這個轉義的方式使用到&,是起不到作用的,不過如果我們把define關閉呢?

SQL> show define

define "&" (hex 26)

SQL> set define off

SQL> show define

define OFF

SQL> select * from test where name like ‘abc\&123‘ escape ‘\‘;

select * from test where name like ‘abc\&123‘ escape ‘\‘

                                   *

ERROR at line 1:

ORA-01424: missing or illegal character following the escape character

可以看到,這裡會報錯的,這個提示是在說,跟在逸出字元後面的錯誤或者缺失的字元,貌似不可以哦,其實在我們關閉define之後,完全可以這樣寫的:

SQL> select * from test where name like ‘abc&123‘;

NAME

--------------------

abc&123

abc&123

abc&123

abc&123

如果你開啟了escape,預設逸出字元為‘\’,可以如下寫:

SQL> set escape on

SQL> show escape

escape "\" (hex 5c)

SQL> select * from test where name like ‘abc\&123‘;

NAME

--------------------

abc&123

abc&123

abc&123

abc&123

當然啦,還有這麼一種方式:

SQL> select * from test where name like ‘abc‘ || chr(38) || ‘123‘;

NAME

--------------------

abc&123

abc&123

abc&123

abc&123

 

好了,差不多就這麼多了,其餘的歡迎補充!

 

註:測試平台:

OS Version:Redhat Enterprise Linux 5 Update 4 x86

DB Version:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

ORACLE逸出字元的那點事

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.