Oracle 字符集定義位元組到字符的映射,分 資料庫端、客戶端、匯出檔 (DMP) 三端。核心參數 NLS_LANG 格式:
NLS_LANG = <語言>_<地域>.<字符集> 例:AMERICAN_AMERICA.ZHS16GBK
真正影響資料儲存/傳輸的是 第三部分 (字符集)。三端字符集第三部分必須一致,語言/地域僅影響訊息顯示。
-- 方法一:最直觀
SELECT userenv('language') FROM dual;
-- 回傳:AMERICAN_AMERICA.ZHS16GBK
-- 方法二:參數視圖 (建議)
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_\NLS_LANG echo $NLS_LANGALTER SESSION SET NLS_LANG = 'AMERICAN_AMERICA.ZHS16GBK';優先序:ALTER SESSION > 環境變數/註冊表 > 參數檔。
DMP 第 2、3 位元組記錄字符集 ID (16進位)。
cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6
-- 取得如 0354,再查詢:
SELECT nls_charset_name(TO_NUMBER('0354','XXXX')) FROM dual;
-- 回傳 ZHS16GBK
-- 完整檢查 SELECT 'DB' src, value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET' UNION ALL SELECT 'INSTANCE', value FROM nls_instance_parameters WHERE parameter='NLS_LANG' UNION ALL SELECT 'SESSION', value FROM nls_session_parameters WHERE parameter='NLS_LANG';
NLS_LANG 使其字符集部分與資料庫端一致。AMERICAN_AMERICA 避免中文錯誤訊息編碼問題。STARTUP MOUNT → ALTER SYSTEM ENABLE RESTRICTED SESSION → ALTER DATABASE CHARACTER SET INTERNAL_USE <新字符集> (僅限超集遷移,如 ZHS16GBK → AL32UTF8)。CSALTER 腳本 (10g+),過程極其複雜,建議諮詢 Oracle 支援。| 字符集 | 說明 | 適用場景 |
|---|---|---|
| ZHS16GBK | 簡體中文雙位元組 (GBK) | 舊版中文系統 |
| ZHT16BIG5 | 繁體中文雙位元組 (Big5) | 繁體中文舊系統 |
| AL32UTF8 | Unicode UTF-8 (含補充字符) | 新系統、多語言、Emoji、國際化首選 |
| UTF8 | 舊版 UTF-8 (不含補充字符) | 舊版多語言系統 |
| WE8ISO8859P1 | 西歐單位元組 | 純英文/西歐語系 |