ORALCE substr函數及substrb與字元集關係 語法 函數用途: SUBSTR函數用來截取從源字元(參數 char)中截取一部分目標字元,截取方式為限定從源字元截取起始位置(參數 positon),並限定截取目標字元長度(參數 substring_length)。substr系列函數計算 ...
語法
函數用途: SUBSTR函數用來截取從源字元(參數 char)中截取一部分目標字元,截取方式為限定從源字元截取起始位置(參數 positon),並限定截取目標字元長度(參數 substring_length)。substr系列函數計算目標字元長度及開始截取字元位置長度的方式有所不同——substr函數為字元,substrb為位元組,substrc為UNICODE完全字元集,substr2為UCS2編碼代碼點,substr4為ucs4編碼代碼點。
- 參數position為0時,按1處理。
- 參數position為正數時,ORACLE數所庫查詢時從左到右從第一個字元開始計數。
- 參數position 為負數時,查詢從右向左從倒數第一個字元開始計數。
- 參數substring_length可為空,為空時直接從position位置開始向後截取所有字元(含position位置字元)。哪果substring為負值 ,則substr函數返還null。
char參數類型可以是 char,varchar2,nchar,nvarchar2,clob或者nclob,但除substr與substrb函數外,另外三個substr系列函數的參數char類型不允許 為CLOB(character large object) 或者NCLOB類型。position與substringlength參數數據類型必須是number數值型,或者可以被隱式轉換為number型的數據類型,並且最終最必須可以被轉換為整型。返回值的類型一般與char參數的數據類型一致,但char、nchar類型的參數返回值實際上分別為varchar2 、nvarchar2類型.position與substringlength參數如果為浮點型數據則被直接自動處理為整型數據。
示例:
1.
SELECT SUBSTR('ABCDEFG',3,4) "Substring" FROM DUAL;
以上語句返回'CDEF',即從第三個字元'C'開始,向右截取長度為4的目標字元,為'CDEF'.
2.
SELECT SUBSTR('ABCDEFG',-5,4) "Substring" FROM DUAL;
以上語句返回'CDEF',即從倒數第五個字元'C'開始,向右截取長度為4的目標字元,為'CDEF'.此處position參數為負值值是起始位置計算從右向左,但截取方向依然為從左向右,而instr(string,substring,position,occurence)函數position參數為負值 時,不僅取起始位置是從右向左,並且匹配計算目標字元串出現次數方向也是從右向左。
3.
SELECT SUBSTRB('ABCDEFG',5,4.2) "Substring with bytes" FROM DUAL;
substrb函數與substr函數不同之處在於它以位元組來計數,而substr函數僅單純以字元來計算,不論是中文還是英文。因此,由於資料庫系統字元集編碼方式的不一致,不同資料庫系統執行上述語句結果可能有所不同。例3示例語句在GBK字元集下,字母占1位元組,因此返還值為'EFG',即從第5個位元組'E'開始,向右截取4個位元組(不滿4個截到末尾即可);而如果是UNICODE字元集,中英文均占2位元組,因此返還值為'CD'.下麵是一些常見的編碼格式字元所占位元組情況:
- 1、ASII:美國標準信息交換碼,用一個位元組的7位可以表示。無漢字字元,一個字母對應一個位元組。;
- 2、ISO8859-1:拉丁碼表,歐洲碼表,用一個位元組的8位可以表示;
- 3、GBK2312:中國的中文編碼表,最多兩個位元組編碼所有字元。一個漢字2位元組,一個字母1位元組;
- 4、GBK:中國的中文編碼表升級,融合了更多的中文文字字元,最多兩個位元組編碼。一個漢字2位元組,一個字母1位元組;
- 5、Unicode:國際標準碼,融合了目前人類使用的所有字元,為每個字元分配唯一的字元碼,所有的文字都用兩個位元組來表示;
- 6、utf-8:變長的編碼方式,可用1-4個位元組來表示一個字元。現在最多的又有6個位元組。一個漢字3位元組,一個字母1位元組; -7、utf-16:中文和字母都是占2個位元組。 -8、utf-32:中文和字母都是占4個位元組。
ORACLE字元串存儲方式
ORACLE資料庫中varchar2類型字元串有varchar2(n char) 和varchar2(n byte)兩種存放方式。一般直接定義為varchar2(n),這樣ORALCE會根據配置文件中的設置選擇以位元組還是以字元為單位。查看具體是以哪種方式可能在PLSQL命令行輸入以下命令查看value值:
show parameter nls_length
ORACLE字元集
可能通過以下語句查詢當前登錄資料庫字元集:
elect userenv('language') from dual;
ORACLE的字元存儲方式與字元集共同決定了一個varchar2型欄位能存儲什麼長度什麼形式的字元,比如:一個varchar2(4)長度的欄位,如果 採用的是GBK編碼方式,即一個漢字占2位元組,字母占1位元組,且存儲方式為byte,則此欄位最多存儲2漢字,4字母。
參考文檔 ORALCE官網 SQL Language Reference:https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/About-SQL-Functions.html#GUID-D51AB228-518C-4213-8BD4-F919623D105E