oracle數據庫中字符串類型varchar2有兩種定義方式,分別是varchar2(n char)和varchar2(n byte),但我們一般習慣定義varchar2(n),這樣oracle會根據配置文件中的設置選擇以字節為單位還是以字符為單位。
我們可以通過pl/sql developer的命令窗口,輸入"show parameter nls_length",查看當前值,如果返回值為byte的話就是以字節存儲的。
先看oracle本身設置是以字節 還是 字符 為單位,再根據數據庫字符集編碼確定可以存儲幾個漢字:以字符集gbk為例,一個中文字符占兩個字節,一個英文字符占一個字節。
例如新建一個表,create table t1(name varchar2(4),如果默認為byte,那么name字段最多只能存儲兩個中文字符或四個英文字符或者一個中文字符和兩個英文字符。
pl/sql中系統函數length和substr針對的是字符,length('測試c')=3,substr('測試c',1,2)='測試',返回的是字符或字符數,不管字符是中文還是西文。
pl/sql中還有一些系統函數是針對字節的,例如lengthb和substrb,lengthb('測試c')=5,substrb('測試c',1,4)='測試',substrb('測試c',1,5)='測試c',
如果是substrb('測試c',1,3),會返回一個三個字節的字符串,由於沒有完全取到兩個中文,我們看到的可能會是亂碼。
查看oracle字符集sql:
select userenv('language') from dual;

一個漢字占用2個字節: SIMPLIFIED CHINESE_CHINA.ZHS16GBK
一個漢字占用3個字節: SIMPLIFIED CHINESE_CHINA.AL32UTF8