GPS平台、網站建設、軟件開發、系統運維,找森大網絡科技!
https://cnsendnet.taobao.com
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=2189
還是用這種方法好一些,用||符號,這個符號應該是字符串連接符
在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 Re
GPS平台、網站建設、軟件開發、系統運維,找森大網絡科技!
https://cnsendnet.taobao.com
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=2189