Oracle 資料庫字元集是資料庫管理與開發人員必須掌握的核心觀念。它決定了資料如何被儲存、解譯與交換,稍有不慎便會導致匯入匯出失敗、資料亂碼等棘手問題。本文從定義切入,系統梳理字元集架構、關鍵參數、查詢方法、修改策略與實務禁忌。
Oracle 字元集是位元組資料的符號對照集合,具有大小與包含關係。Oracle 的國家語言支援架構(NLS)讓資料庫工具、錯誤訊息、排序規則、日期時間、貨幣、數字與行曆自動適應本地語言與平台。
影響字元集最關鍵的參數是 NLS_LANG,格式為:
NLS_LANG = language_territory.charset
三大組成:
範例:AMERICAN_AMERICA.ZHS16GBK。重點:兩資料庫間匯入匯出僅需第三部分一致即可,前兩部份僅影響提示語言。
匯入失敗常因三端字元集不一致:
三者必須完全一致才能正確匯入。
SELECT userenv('language') FROM dual;
結果範例:AMERICAN_AMERICA.ZHS16GBK
DMP 第 2、3 個位元組記錄字元集代碼(十六進制)。
SELECT nls_charset_name(to_number('0354','xxxx')) FROM dual;cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME\NLS_LANG 或 DOS 臨時設定 set nls_lang=AMERICAN_AMERICA.ZHS16GBKecho $NLS_LANG若三端不一致,請統一修改為與 Server 端相同。
字元集間存在包含關係(如 US7ASCII ⊂ ZHS16GBK ⊂ UTF8)。原則:僅支援從子集轉超集,反向或無包含關係(如 ZHS16GBK 與 ZHS16CGB231280)均不支援。
資料庫建立後理論上不可變更。若強行修改需確認子集/超集關係,否則嚴重損壞資料庫。Oracle 8 以前可改 props$ 表,Oracle 8 後至少三張系統表記錄字元集資訊,單改 props$ 不完全。正規流程需關庫、啟動 MOUNT、啟用 RESTRICTED SESSION、關閉 JOB/AQ 進程、ALTER DATABASE CHARACTER SET、重啟。
直接修改 DMP 第 2、3 位元組「欺騙」檢查。理論上仍限子集→超集,實務上常用字元集(US7ASCII、WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK)多可互改。步驟:
SELECT to_char(nls_charset_id('ZHS16GBK'), 'xxxx') FROM dual; → 03540354AL32UTF8(Unicode)以最大相容性