字元集決定資料庫如何儲存、解析與顯示文字資料,選擇錯誤會導致資料亂碼、匯入匯出失敗。本文系統整理 Oracle 字元集命名規則、NLS_LANG 參數解析、三端字元集查詢方法、修改字元集的風險與限制,以及客戶端設定優先順序,助您避開常見陷阱。
格式:<Language><bit size><encoding>,即 語言_位元數_編碼。
ZHS16GBK = 簡體中文 (ZHS) + 16-bit (2 Bytes) + GBK 編碼AL32UTF8 (Unicode UTF-8)、ZHT16MSWIN950 (繁體中文 Big5)、ZHS16CGB231280 (GB2312-80)NLS_LANG = LANGUAGE_TERRITORY.CHARACTERSET
兩資料庫間匯入匯出僅需 Charset 部分相同即可;Language/Territory 僅影響介面提示語言。
匯入匯出需 Server / Client / DMP檔 三端字元集一致。
-- 方法一:直觀查詢
SELECT USERENV('LANGUAGE') FROM DUAL;
-- 結果範例:SIMPLIFIED CHINESE_CHINA.ZHS32GB18030
-- 方法二:查看所有 NLS 參數
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
-- 結果欄位 NLS_CHARACTERSET = ZHS32GB18030
-- 方法三:資料庫屬性視圖(最權威)
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
DMP 檔第 2、3 位元組記錄字元集 ID(十六進位)。
-- 假設 UltraEdit 開啟 DMP 見 0354
SELECT NLS_CHARSET_NAME(TO_NUMBER('0354', 'XXXX')) FROM DUAL;
-- 回傳:ZHS16GBK
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<Home名>\NLS_LANGecho $NLS_LANGSELECT * FROM NLS_SESSION_PARAMETERS;核心原則:資料庫建立後字元集理論上不可變。官方僅支援子集 → 超集轉換(如 US7ASCII → AL32UTF8),不支援無包含關係互轉(如 ZHS16GBK ↔ ZHS16CGB231280)。
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS32GB18030; -- 繞過子集檢查
SHUTDOWN IMMEDIATE;
STARTUP;
參數說明:
INTERNAL_USE:跳過子集/超集驗證,極易導致資料損毀RESTRICTED SESSION:限制只有特定權限用戶連線,利於維護操作JOB_QUEUE_PROCESSES=0、AQ_TM_PROCESSES=0:關閉背景作業與隊列監控優先序:ALTER SESSION > 環境變數 > 登錄表 > 參數檔
AMERICAN_AMERICA.ZHS16GBK),避免中文錯誤訊息編碼問題NLS_DATABASE_PARAMETERS:資料庫實際字元集(來源 PROPS$)NLS_INSTANCE_PARAMETERS:執行個體層級設定(參數檔/環境變數/登錄表)NLS_SESSION_PARAMETERS:會話層級設定(ALTER SESSION/環境變數)AL32UTF8 支援多語言,避免後續轉換痛苦V$NLS_PARAMETERS、NLS_DATABASE_PARAMETERS、Client 環境變數