1.基本概念
oracle提供4種字符串類型:
CHAR,NCHAR,VARCHAR2,NVARCHAR2
前兩者是定長類型,存儲時按原值存儲;后兩者是變長類型,存儲是會自動去除字符串前后的空字符。
CHAR和VARCHAR2是以數據庫字符集編碼(由參數NLS_CHARACTERSET指定)存儲的字符串;NCHAR,NVARCHAR2是以國家字符集編碼(由NLS_NCHAR_CHARACTERSET指定)存儲的字符串。
另外 NLS_LENGTH_SEMANTICS參數用來設置字符串長度的物理存儲單位,它有兩個取值:CHAR/BYTE,默認值是BYTE。舉例如:
NLS_LENGTH_SEMANTICS = CHAR
DECLARE
myString VARCHAR(2);--這里的2表示2個字符
BEGIN
myString := '中國';--OK
NLS_LENGTH_SEMANTICS = CHAR
DECLARE
myString VARCHAR(2)--這里的2表示2個字節(byte)
BEGIN
myString := '中國';--錯誤,長度不夠
對NULL的認知,舉例:
DECLARE
myChar char(10) := '';
myVarchar varchar2(10) := '';
BEGIN
IF myChar IS NULL THEN
DBMS_OUTPUT.PUTLINE('myChar is null');
ELSE
DBMS_OUTPUT.PUTLINE('myChar is not null');
END IF;
IF myVarchar IS NULL THEN
DBMS_OUTPUT.PUTLINE('myVarchar is null');
ELSE
DBMS_OUTPUT.PUTLINE('myVarchar is not null');
END IF;
...
輸出結果:
myChar is not null
myVarChar is null
2.常用情況
字符串的字面表示
兩種方式,舉例:
原始串:i'm a programmer.
一種方式是,頭尾單引號,由兩個單引號字面代表一個單引號: 'i''m a programmer.'
另一種方式是,q'表示法:q'{i'm a programmer} 或 q'!i'm a programmer.!
q'表示其后的字符是一個字符串分隔符,上例中,{,!是字符串分隔符。注意,如果分隔符的起始是[, {, <, (, 那相應的結束符就必須是], }, >, )
q'只作用于char,varchar2,對應NCHAR,NVARCHAR2的是n',對應unicode的是u'
使用不可見字符
SELECT name || chr(10)
|| address1 || chr(10)
|| address2 || chr(10)
|| address3 || chr(10)
|| address4 || chr(10)
|| city || ', ' || state || ' ' || zipcode
AS company_address
FROM company;
本例中chr(10)代表換行符。
連接字符串的兩種方式
CONCAT ('abc', 'defg') --> 'abcdefg'
CONCAT (NULL, 'def') --> 'def'
CONCAT ('ab', NULL) --> 'ab'
CONCAT (NULL, NULL) --> NULL
DECLARE
x VARCHAR2(100);
BEGIN
x := 'abc' || 'def' || 'ghi';
DBMS_OUTPUT.PUT_LINE(x);
END;
大小寫轉換函數
LOWER(string)
UPPER(string)
NLS_COMP,NLS_SORT
NLS_COMP影響字符串的比較和排序的規則
Syntax NLS_COMP = {BINARY | ANSI}
Default value BINARY
Syntax NLS_SORT = {BINARY | linguistic_definition}
Default value Derived from NLS_LANGUAGE
注意:將NLS_SORT設置為非BINARY時,查詢數據庫時將導致全表掃描。
將字符串中的單詞的首字母變為大寫
DECLARE
name VARCHAR2(30) := 'MATT williams';
BEGIN
DBMS_OUTPUT.PUT_LINE(INITCAP(name));
END;
輸出結果:
Matt Williams
DECLARE
name VARCHAR2(30) := 'JOE mcwilliams';
BEGIN
DBMS_OUTPUT.PUT_LINE(INITCAP(name));
END;
輸出結果:
Joe Mcwilliams
3.字符串函数快速参考
ASCII(single_char) RETURN NUMBER;
返回单个字符的ASCII码值;
ASCIISTR(string1) RETURN STRING;
返回字符串中的ASCII字符。
CHR(integer)
返回参数指定的ASCII值的字符,是ASCII函數的反向
還有一種用法是 CHR(integer USING NCHAR_CS),以返回國家字符集的字符
COMPOSE(string1)
ã = 'a/0303'
COMPOSE('a/0303') 返回ã的unicode的十六進制值
CONCAT(string1, string2)
連接兩個字符串,相當與||
CONVERT(string1, target_char_set)
將string1轉換成字符集target_char_set格式
也可以指定來源字符集:CONVERT(string1, target_char_set,source_char_set)
DECOMPOSE(string1)
與COMPOSE相反
GREATEST(string1, string2, ...)
返回一組字符串中最大的那個
INITCAP(string1)
將英文句子中的單詞首字母大寫
INSTR(string1, string2)
返回string2在string1中的起始位置,相當于delphi中的pos函數
LEAST(string1, string2, ...)
返回一組字符串中最小的字符串,與GREATEST相反
LENGTH(string1)
返回字符串長度
注意 LENGTH('') IS NULL
LOWER(string1)
字符串轉換為小寫
UPPER函數與其相對
LPAD(string1, padded_length)
在string1左邊添加padded_length個空格
LPAD(string1, padded_length,pad_string)
在string1左邊添加padded_length個pad_string
RPAD與其相對
LTRIM(string1)
消除string1左邊的空字符
與LTRIM函數相對
NCHR(code_location)
類似與CHR函數,只不過返回的是國際字符集的對應碼值
NLS_INITCAP(string1)
與INITCAP類似,字符集不同
NLS_LOWER
與LOWER類似,字符集不同
NLS_UPPER
與UPPER類似,字符集不同
REGEXP_INSTR, REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR
正則表達式函數,后面專門介紹
REPLACE(string1, match_string, replace_string)
查找string1中與match_string匹配的子字符,并替換為replace_string
SOUNDEX(string1)
返回string1的語言表達的代號,如:
SOUNDEX ('smith') --> 'S530'
SOUNDEX ('SMYTHE') --> ''S530'
SOUNDEX ('smith smith') --> 'S532'
SOUNDEX ('smith z') --> 'S532'
SOUNDEX ('feuerstein') --> 'F623'
SOUNDEX ('feuerst') --> 'F623'
SUBSTR(string1, start, length)
截取string1從位置start開始,長度為length的部分
TO_CHAR(national_character_data)
將國家字符集的數據轉換為數據庫字符集格式
TO_MULTI_BYTE(string1)
將單字節字符串轉換為多字節字符串unicode
TO_NCHAR(database_character_data)
將數據庫字符集的數據轉換為國家字符集格式
TO_SINGLE_BYTE(string1)
將多字節字符串轉換為單字節字符串
TRANSLATE (string1, search_set, replace_set)
類似與REPLACE函數,但又不同,舉例:
TRANSLATE('ABCDCE','ABC','XXX') = 'XXXDXE' --單個字符匹配
REPLACE('ABCDCE','ABC','XXX')= 'XXXDCE' --整個串匹配
TRIM (FROM string1)
去掉字符串頭尾的指定字符
UNISTR(string1)
將string1轉換為UNICODE