實務上常需清洗資料,移除特殊字元僅保留中文。本文提供兩種 PL/SQL 實作方案並分析優劣。
原理: 中文字元在 LENGTH 中計為 1 字元,在 LENGTHB 中佔 2 位元組;英文/數字/常見符號兩者相等。
CREATE OR REPLACE FUNCTION get_chinese_v1(p_str VARCHAR2) RETURN VARCHAR2 IS
v_len NUMBER := LENGTH(p_str);
v_lenb NUMBER := LENGTHB(p_str);
v_result VARCHAR2(4000);
BEGIN
IF v_len = v_lenb THEN
RETURN NULL; -- 純 ASCII
END IF;
-- 逐字元判斷邏輯略
RETURN v_result;
END;
缺點: 部分特殊字元(如全形符號)同樣符合「1字元=2位元組」,導致誤判。
原理: 常用漢字在 Oracle 字元集(如 ZHS16GBK)中的內部碼範圍約為 45217~63486。利用 ASCII() 函數逐字元判斷。
CREATE OR REPLACE FUNCTION get_chinese_text(p_str VARCHAR2) RETURN VARCHAR2 IS
v_result VARCHAR2(4000) := '';
v_len NUMBER := LENGTH(p_str);
v_char VARCHAR2(2);
v_ascii NUMBER;
BEGIN
FOR i IN 1..v_len LOOP
v_char := SUBSTR(p_str, i, 1);
v_ascii := ASCII(v_char);
IF v_ascii > 45216 THEN
v_result := v_result || v_char;
END IF;
END LOOP;
RETURN v_result;
END get_chinese_text;
SELECT get_chinese_text('ABC中文123測試!@#') FROM dual;
-- 返回:中文測試
結論: 方案二能完美區分漢字與其他字元,適用於資料清洗、ETL 前處理等場景。