首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle ASCII 與十六進制字串雙向轉換函數完整實作(含中文支援)

     編輯:Oracle 資料庫相關知識

需求場景

資料遷移、加密解密、異構系統整合常需在 **ASCII 字串** 與 **HEX 十六進制** 之間互轉。Oracle 內建 RAWTOHEX/HEXTORAW 僅支援 RAW 型別,對 VARCHAR2 需自行封裝,且中文雙位元編碼需特別處理。

核心函數實作

1. ASCII → HEX (通用)

CREATE OR REPLACE FUNCTION ascii_to_hex (p_str IN VARCHAR2) RETURN VARCHAR2
IS
    v_hex VARCHAR2(4000);
BEGIN
    FOR i IN 1 .. LENGTH(p_str) LOOP
        v_hex := v_hex || TRIM(TO_CHAR(ASCII(SUBSTR(p_str, i, 1)), 'XXXX'));
    END LOOP;
    RETURN UPPER(v_hex);
END;
/

2. HEX → ASCII (資料庫字元集為中文,如 ZHS16GBK / AL32UTF8)

CREATE OR REPLACE FUNCTION hex_to_ascii_zh (p_hex IN VARCHAR2) RETURN VARCHAR2
IS
    v_str VARCHAR2(4000);
    v_pos NUMBER := 1;
    v_byte NUMBER;
BEGIN
    WHILE v_pos <= LENGTH(p_hex) LOOP
        v_byte := TO_NUMBER(SUBSTR(p_hex, v_pos, 2), 'XXXX');
        IF v_byte > 128 THEN          -- 雙位元字元 (中文)
            v_str := v_str || CHR(TO_NUMBER(SUBSTR(p_hex, v_pos, 4), 'XXXX'));
            v_pos := v_pos + 4;
        ELSE                          -- 單位元字元 (ASCII)
            v_str := v_str || CHR(v_byte);
            v_pos := v_pos + 2;
        END IF;
    END LOOP;
    RETURN v_str;
END;
/

3. HEX → ASCII (資料庫字元集為單位元,如 US7ASCII / WE8ISO8859P1)

CREATE OR REPLACE FUNCTION hex_to_ascii_en (p_hex IN VARCHAR2) RETURN VARCHAR2
IS
    v_str VARCHAR2(4000);
BEGIN
    FOR i IN 1 .. LENGTH(p_hex)/2 LOOP
        v_str := v_str || CHR(TO_NUMBER(SUBSTR(p_hex, (i-1)*2+1, 2), 'XXXX'));
    END LOOP;
    RETURN v_str;
END;
/

測試驗證

-- 中文環境測試
SELECT hex_to_ascii_zh(ascii_to_hex('你好ABC嗎')) FROM dual;
-- 結果: 你好ABC嗎

-- 純英文環境測試
SELECT hex_to_ascii_en(ascii_to_hex('Hello World')) FROM dual;
-- 結果: Hello World

進階替代方案:內建 UTL_RAW/UTL_I18N (10g+)

-- ASCII -> HEX (支援任意字元集)
SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CAST_TO_RAW('你好ABC嗎')) FROM dual; -- 錯誤示範
-- 正確做法:
SELECT RAWTOHEX(UTL_I18N.STRING_TO_RAW('你好ABC嗎', 'AL32UTF8')) FROM dual;

-- HEX -> ASCII
SELECT UTL_I18N.RAW_TO_CHAR(HEXTORAW('E4BDA0E5A5BD414243E5978E'), 'AL32UTF8') FROM dual;

效能與選型建議

方案優點缺點建議場景
自訂 PL/SQL 函數邏輯透明、可移植舊版本效能較差、需自行處理字元集8i/9i 老舊環境、特殊編碼邏輯
UTL_I18N + RAWTOHEX原生支援 Unicode、效能佳、標準化10g+ 才完整支援現代專案 (11g/12c/19c/21c) 首選

結語

字串與 HEX 互轉看似簡單,**字元集處理才是核心陷阱**。新專案請直接使用 UTL_I18N 套件;維護舊系統時,務必確認資料庫 NLS_CHARACTERSET 選用對應函數,並建立完整測試案例覆蓋中英混雜、特殊符號、空字串等邊界情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved