| 類別 | 函數 | 返回類型 | 核心用途 |
|---|---|---|---|
| 返回字符 | CHR | VARCHAR2/CHAR | 數值轉字符(ASCII 反函數) |
| CONCAT | VARCHAR2 | 兩字符串連接(等同 ||) | |
| INITCAP | VARCHAR2 | 單詞首字母大寫 | |
| LTRIM | VARCHAR2 | 左側去除指定字符集 | |
| NLS_INITCAP | VARCHAR2 | 支援多語言排序的首字母大寫 | |
| NLS_LOWER | VARCHAR2 | 多語言感知轉小寫 | |
| NLS_UPPER | VARCHAR2 | 多語言感知轉大寫 | |
| REPLACE | VARCHAR2 | 子串替換/刪除 | |
| RPAD | VARCHAR2 | 右側填充至指定長度 | |
| RTRIM | VARCHAR2 | 右側去除指定字符集 | |
| SOUNDEX | VARCHAR2 | 發音代碼(模糊匹配) | |
| SUBSTR | VARCHAR2 | 子串擷取(支援負數從右計) | |
| TRANSLATE | VARCHAR2 | 字符級一對一映射/刪除 | |
| UPPER | VARCHAR2/CHAR | 簡單轉大寫 | |
| 返回數字 | ASCII | NUMBER | 首字符編碼值 |
| INSTR | NUMBER | 子串位置(支援從右/第 N 次) | |
| INSTRB | NUMBER | 字節級位置 | |
| LENGTH | NUMBER | 字符長度(CHAR 計尾部空格) | |
| LENGTHB | NUMBER | 字節長度 | |
| NLSSORT | RAW | 排序鍵值(語言感知) |
SUBSTR('HelloWorld', 1, 5) -- 'Hello' 從左起第1個取5個
SUBSTR('HelloWorld', -5, 3) -- 'Wor' 從右起第5個取3個
SUBSTR('HelloWorld', -5) -- 'World' 從右起第5個取到結尾
陷阱:LENGTH 計算 CHAR 型別尾部空格,LENGTHB 單字節集下與 LENGTH 相同,多字節集下不同。
INSTR('abcabc', 'ab', 1, 2) -- 4 從左起第2次出現位置
INSTR('abcabc', 'ab', -1, 1) -- 4 從右起搜尋,返回相對字符串開頭的位置
| 場景 | 推薦 | 原因 |
|---|---|---|
| 整詞替換 'abc'→'xyz' | REPLACE | 語意清晰,支援刪除(第三參數為 NULL) |
| 字符集映射 'abc'→'123' | TRANSLATE | 逐字符映射,from_str > to_str 時自動刪除多餘字符 |
| 移除所有標點 | TRANSLATE(str, '!"#$%', '') | 單次調用完成多字符刪除 |
-- 德語排序中 ß 視為 ss
NLS_UPPER('straße', 'NLS_SORT=XGERMAN') -- 'STRASSE'
-- 傳統 UPPER 無法處理
UPPER('straße') -- 'STRASSE' (12c+ 已改進,舊版本失效)
參數 nlsparams 格式:'NLS_SORT=sort_name' 或 'NLS_LANGUAGE=language'。
SELECT * FROM employees
WHERE SOUNDEX(last_name) = SOUNDEX('Smith'); -- 匹配 Smyth, Smithe 等
| 類型 | 最大長度 | 備註 |
|---|---|---|
| VARCHAR2 | 4000 位元組 (12c MAX_STRING_SIZE=EXTENDED 可至 32767) | PL/SQL 中可 32767 |
| CHAR | 2000 位元組 | 固定長度,右補空格 |
| CLOB | 4GB | 大文本首選 |
最佳實踐:所有字符操作優先用 VARCHAR2,超長文本改用 DBMS_LOB 套件處理。
-- 1. 手機號碼脫敏:中間4位替換為****
SELECT REPLACE(phone, SUBSTR(phone, 4, 4), '****') FROM customers;
-- 2. 字符串分裂為行(11g REGEXP_SUBSTR + CONNECT BY)
SELECT REGEXP_SUBSTR('a,b,c,d', '[^,]+', 1, LEVEL) AS token
FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT('a,b,c,d', ',') + 1;
-- 3. 首尾去空格 + 多空格合一
SELECT REGEXP_REPLACE(TRIM(col), '\s+', ' ') FROM t;
-- 4. 獲取文件擴展名
SELECT SUBSTR(filename, INSTR(filename, '.', -1) + 1) FROM files;
熟練掌握這 21 個字符函數,配合正則表達式(REGEXP_* 系列),可解決 95% 以上的文本處理需求。記住:多語言環境優先用 NLS_* 系列,字符級映射用 TRANSLATE,詞級替換用 REPLACE,擷取定位用 SUBSTR/INSTR 組合。