oracle資料庫--Oracle雙引號和單引號的區別小結

風靈使發表於2018-09-14

注意:

在取別名,某些to_char中,以及建立表空間名字 還有建立使用者的密碼時,這些時候需要使用雙引號。雙引號裡面的內容是嚴格區分大小寫,單引號則不用,系統自動翻譯成大寫。

其他一些情況如下:
一般情況下,我們使用單引號居多但在字符集不一致的時候,雙引號和單引號區別還是很大的。而且,使用ODBC橋匯入外部資料的時候,表名是帶雙引號的先看個案例:

以前遇到過一個這樣的問題一個朋友在建立表時,表名採用小寫,並且表名用雙引號括了起來

表已經建立了,但是在查詢的時候,顯示錶名不存在,可在user_tables又能看到這張表觀察得出,加了雙引號的小寫表名存入資料庫後也是小寫用雙引號擴起來的識別符號都作為原來的大小寫格式存放在資料字典中而Oracle在呼叫時,預設的使用大寫格式去資料字典中查詢,以列名為例:

    sys@EMREP> create table test(a varchar2(10), a varchar2(10));

    create table test(a varchar2(10), a varchar2(10))
                                      *
    ERROR at line 1:
    ORA-00957: duplicate column name
    sys@EMREP> create table test("a" varchar2(10), a varchar2(10));

    Table created.

    sys@EMREP> SELECT table_name, column_name FROM user_tab_cols WHERE table_name = 'TEST';

    TABLE_NAME                     COLUMN_NAME
    ------------------------------ ------------------------------
    TEST                           a
    TEST                           A
    sys@EMREP> insert into test values ('1','1');

    1 row created.

    sys@EMREP> commit;

    Commit complete.

    sys@EMREP> select * from test;

    a          A
    ---------- ----------
    1          1

以大寫方式存在資料字典中,驗證一下:

    sys@EMREP> create table test_xxxx(a varchar2(1), "A" varchar2(1));
    create table test_xxxx(a varchar2(1), "A" varchar2(1))
                                          *
    ERROR at line 1:
    ORA-00957: duplicate column name

雙引號括起來的更確切一點叫 “引證識別符號”

比如我們建立一張表,我們在寫CREATE語句的時候,就算表名用小寫,資料字典裡儲存的所有識別符號還是大寫的

但是要想在資料字典裡儲存小寫的識別符號,那寫CREATE語句的時候就得用雙引號

所以要識別符號區分大小寫,或在識別符號中包含空格,或者使用保留字做識別符號,就得用雙引號括起來的引證識別符號

雙引號:
① 表示其內部的字串嚴格區分大小寫
② 用於特殊字元或關鍵字
③ 不受識別符號規則限制
④ 會被當成一個列來處理
⑤ 當出現在to_char的格式字串中時,雙引號有特殊的作用,就是將非法的格式符包裝起來
避免出現ORA-01821: date format not recognized錯誤, to_char在處理格式字串時,會忽略雙引號

    sys@EMREP> select to_char(sysdate, 'hh24"小時"mi"分"ss"秒"') AS RESULT from dual;

    RESULT
    ------------------
    17小時3130

單引號:
① 表示字串常量
② 字串中的雙引號僅僅被當作一個普通字元進行處理。此時,雙引號不需要成對出現

例如:

    sys@EMREP> select 'hh24"小時""mi"分"""ss"秒"' AS RESULT from dual;

    RESULT
    -----------------------------
    hh24"小時""mi"分"""ss"秒"

③ 動態SQL:
在一對單引號包含的語句中,必須有一對相鄰的單引號表示一個單引號
兩個相鄰的單引號的作用,第一個是用來表示轉義字元,後面一個表示真正的單引號
單引號裡要用單引號應該是兩個連續的單引號,而不是雙引號
例如:

select 'alter system kill session ''''|| sid||','||serial#|| '''';' from v$session

oracle中單引號和雙引號的作用

在Oracle資料庫,單引號我們經常會用到,相對來說雙引號用的頻率少,但雙引號的作用也是不可代替的,現簡要說一下兩者的作用。

一.單引號

1.單引號用於標識字元與數字的區別;

例如

select * from table_name where id=1;這種代表查詢的是數字

select * from table_name where id='1';這種代表查詢的是字元

2.當指定字串文字時,必須用單引號將字串文字引注

3.兩個單引號表示一個單引號(兩個'' 表示了一個'

二.雙引號

1.如果建立物件的時候,物件名、欄位名加雙引號,則表示Oracle將嚴格區分大小寫,否則Oracl都預設大寫。

示例:

select '欄位1' As "列a",'欄位2' "小寫b",'欄位c' 預設大寫c from dual;

列名分別是:列a,小寫b,預設大寫C

2.雙引號用在字串中當成普通字元處理

當表中欄位與oracle資料庫關鍵字相同時,可以用雙引號引注,這樣可以避免衝突

3.雙引號用在to_char函式裡的字串中時,有特殊作用,可以將特殊字元包起來,避免出現ORA-01821: date format not recognized錯誤。也就是說,去掉雙引號和其包含的字元後,剩下的應該是一個合法的格式串。

例如:select to_char(sysdate, 'hh24"小時"mi"分"ss"秒"') AS RESULT from dual;


oracle 中使用單引號(')和雙引號(")

在ORACLE中,單引號有兩個作用:
1:字串是由單引號引用—字串引用。
2:轉義。
轉義時:單引號的使用是就近配對,即就近原則。

1.從第二個單引號開始被視為轉義符,如果第二個單引號後面還有單引號(哪怕只有一個)。

SQL> select '''' result from dual;
RESULT
------
'   

第二個單引號被作為轉義符,第三個單引號被轉義,可將sql寫成這樣更好理解:

select ' '' ' from dual;
output:'

2.連線符‘||’導致了新一輪的轉義:
連線符號‘||’左右的單引號沒有任何的關係,
除非‘||’是作為字串的一部分(這在動態SQL中很常見)。

SQL> select 'name'||'''' result from dual;

RESULT
------
name'

理解:||後面的作為一個字串,即前後是',中間又是一個密集型單引號串'',因此第一個為轉義功能.

SQL> select 'name''''' result from dual;
RESULT
------
name''

第一個和最後一個單引號作為字串引用符,中間四個單引號兩兩轉義.

oracle中使用雙引號:
1)一般來說,字串中的雙引號僅僅被當作一個普通字元進行處理。
此時,雙引號不需要成對出現:

SQL> select 'hh24"小時""mi""分"""ss"秒"' results from dual;
RESULTS
-------------------------
hh24"小時""mi""分"""ss"秒"

2)當出現在to_char的格式字串中時,雙引號有特殊的作用,
就是將非法的格式符包裝起來,避免出現ORA-01821: date format not recognized錯誤。
也就是說,去掉雙引號和其包含的字元後,剩下的應該是一個合法的格式串。
to_char在處理格式字串時,會忽略雙引號:

SQL> select to_char(sysdate,'hh24"小時"mi"分"ss"秒"') results from dual;
RESULTS
--------------
06小時3951

格式串為'hh24"小時"mi"分"ss"秒"'
去掉雙引號部分後,剩下的是'hh24miss',是一個合法的格式串。
不過即使真不知道雙引號的這個用法,也可以這樣來處理,雖然麻煩一點:

select to_char(sysdate, 'hh24') || '小時' ||
       to_char(sysdate, 'mi') || '分' ||
       to_char(sysdate, 'ss') || '秒'
       AS RESULT
from dual;
RESULT
--------------
06小時40分18秒

相關文章