無論測(cè)試或者開發(fā),對(duì)數(shù)據(jù)庫的增刪改查都是家常便飯。但有些小知識(shí)是經(jīng)常被忽略,卻又不能不去了解的,例如單引號(hào)和雙引號(hào)的用法和區(qū)別,看完這一篇,你肯定會(huì)有收獲。
![]()
首先我們要區(qū)別一個(gè)概念,即單引號(hào)(‘)和雙引號(hào)(“)和兩個(gè)單引號(hào)(‘’),在PL/SQL中明顯是不同的,單引號(hào)就是單引號(hào),雙引號(hào)就是雙引號(hào)。那么我們來看下單引號(hào)和雙引號(hào)在Oracle的世界中有什么區(qū)別。
Oracle中的單引號(hào)
在Oracle中,單引號(hào)主要有兩種用途:
一是引用字符串
二是轉(zhuǎn)義
讓我們直接從問題出發(fā),反向論證。
Q1 如何打印出單引號(hào)?
我們知道單引號(hào)經(jīng)常用來標(biāo)識(shí)內(nèi)容為字符串(引用),但是怎么來標(biāo)識(shí)自己呢?如果直接這樣寫,那么就會(huì)報(bào)錯(cuò)。
select ''' from dual;
> ORA-01756: 引號(hào)內(nèi)的字符串沒有正確結(jié)束
因此,這邊用到了單引號(hào)的轉(zhuǎn)義用法,即用單引號(hào)轉(zhuǎn)義自己:’’
沒錯(cuò),就是寫成兩個(gè)單引號(hào),轉(zhuǎn)義類似語言中的反斜杠(\),下面SQL中的綠色部分就是轉(zhuǎn)義的位置。
select''''fromdual;
![]()
Q2如果轉(zhuǎn)義單引號(hào)和字符串的引號(hào)連續(xù),如何選擇優(yōu)先級(jí)?
如果轉(zhuǎn)義字符前后還有字符串,那么該怎么判斷其優(yōu)先級(jí)呢,是先表示字符串的,還是先轉(zhuǎn)義。
select'name''is'fromdual;
例如上面這個(gè)SQL,兩個(gè)字符串連在一起,那么是輸出拼接后的nameis還是 name’is?其實(shí)這邊看似兩個(gè)字符串,其實(shí)中間的兩個(gè)單引號(hào)是轉(zhuǎn)義,所以結(jié)果是 name’is. select'name''is'fromdual;#中間引號(hào)為轉(zhuǎn)義的單引號(hào)
那有沒有連續(xù)轉(zhuǎn)義的場(chǎng)景呢,例如下面這個(gè)sql,就是連續(xù)轉(zhuǎn)義。
select'name'''''fromdual;
如上,sql中進(jìn)行了連續(xù)兩個(gè)轉(zhuǎn)義,因此結(jié)果是name''
Q3單引號(hào)遇到||拼接還可以繼續(xù)轉(zhuǎn)義嗎?
我們都知道,在sql語句中,如果想要多個(gè)字段拼接,可以用雙豎線||來實(shí)現(xiàn)。而||兩邊的字符串是沒有任何關(guān)聯(lián)的,互不干擾,即使是轉(zhuǎn)義字符也是一樣的,可以看到下面這個(gè)例子。
select'I'||''''||'amJack'fromdual;
語句中由兩個(gè)||將字符串分成了3部分,且每段都是互相獨(dú)立的。那么中間4個(gè)單引號(hào)是如何顯示的?其實(shí)是中間兩個(gè)單引號(hào)是轉(zhuǎn)義,前后兩個(gè)單引號(hào)只是字符串的引用而已(4個(gè)單引號(hào)只為了顯示1個(gè)單引號(hào)),因此結(jié)果就是:I'amJack
Q4單引號(hào)的轉(zhuǎn)義太復(fù)雜,易混亂,有沒有簡(jiǎn)單的標(biāo)識(shí)方法?
對(duì)于簡(jiǎn)單的sql語句中含有個(gè)別單引號(hào)還可以接受,但是如果sql語句中包含大量的單引號(hào),豈不是很混亂,要崩潰?
select'insertintobp_data_router(ACCESS_TYPE,ACCESS_CODE,BE_ID,EFF_DATE,CUST_ID_PREFIX,EXP_DATE,STATUS,CUST_ID)values('||''||t.access_type||','''||t.access_code||''','||t.be_id||',to_date('''||to_char(t.eff_date,'yyyymmddhh24miss')||''','||'''yyyymmddhh24miss''),'||t.cust_id_prefix||','||'to_date('''||to_char(t.exp_date,'yyyymmddhh24miss')||''','||'''yyyymmddhh24miss''),'''||t.status||''','||t.cust_id||');'frombp_data_routertwhereto_char(t.eff_date,'yyyymmddhh24miss')>'20170119004300'andt.eff_date
對(duì)于類似復(fù)雜場(chǎng)景,為了避免出錯(cuò),建議使用ASCII碼來表示:chr(39)
selectchr(39)fromdual;#’
Oracle中的雙引號(hào)
一般來說,雙引號(hào)沒有單引號(hào)那么復(fù)雜,它就是一個(gè)普通的字符。
select'"'fromdual;
![]()
但是,當(dāng)出現(xiàn)在to_char的格式字符串中時(shí),雙引號(hào)有特殊的作用,就是將非法的格式符包裝起來,避免出現(xiàn)ORA-01821:dateformatnotrecognized錯(cuò)誤。?也就是說,去掉雙引號(hào)和其包含的字符后,剩下的應(yīng)該是一個(gè)合法的格式串。此時(shí),to_char在處理格式字符串時(shí),會(huì)忽略雙引號(hào)。
selectto_char(sysdate,'hh24"小時(shí)"mi"分"ss"秒"')resultsfromdual;
如上這個(gè)寫法,“小時(shí)”這部分是不能帶入到語言內(nèi)部運(yùn)算的,程序會(huì)默認(rèn)忽略這部分字符,但是輸出的時(shí)候,又把它們加上,這就是雙引號(hào)的作用。
#忽略之后執(zhí)行這樣的語句:
selectto_char(sysdate,'hh24miss')resultsfromdual;
#輸出結(jié)果再加上雙引號(hào)的格式:
>>22小時(shí)50分59秒
總結(jié):
綜上所述,Oracle中的單引號(hào)可以充當(dāng)轉(zhuǎn)義字符,且優(yōu)先級(jí)較高,而雙引號(hào)只是個(gè)普通字符,只有在to_char中才能發(fā)揮特別作用。
最后:在我的V :atstudy-js,可以免費(fèi)領(lǐng)取一份10G軟件測(cè)試工程師面試寶典文檔資料。以及相對(duì)應(yīng)的視頻學(xué)習(xí)教程免費(fèi)分享!其中包括了有基礎(chǔ)知識(shí)、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫、抓包工具專題、接口測(cè)試工具、測(cè)試進(jìn)階-Python編程、Web自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試、測(cè)試高級(jí)持續(xù)集成、測(cè)試架構(gòu)開發(fā)測(cè)試框架、性能測(cè)試、安全測(cè)試等。
![]()
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.