字符集不一致是資料遷移、跨環境部署、亂碼問題的首要成因。本文系統整理三層字符集(資料庫端、客戶端、匯出檔)的查詢方法、修改步驟、Windows/Linux 環境變數與註冊表配置,並說明一致性原則與語言設定建議。
| 層級 | 查詢視圖 | 來源 | 說明 |
|---|---|---|---|
| 資料庫字符集 | NLS_DATABASE_PARAMETERS |
props$ | 資料庫實際儲存編碼,SELECT * FROM nls_database_parameters |
| 執行個體/客戶端字符集 | NLS_INSTANCE_PARAMETERS |
v$parameter | 參數檔/環境變數/註冊表設定 |
| 會話字符集 | NLS_SESSION_PARAMETERS |
v$nls_parameters | 會話級 ALTER SESSION 或環境變數,優先級最高 |
ALTER SESSION > 環境變數 > 註冊表 (Windows) > 參數檔
原則: 客戶端字符集必須與資料庫端一致,才能正確顯示非 ASCII 字元。語言設定可不同,建議使用英文 (如 AMERICAN_AMERICA.ZHS16GBK)。
IMP/EXP 或 DATAPUMP 時,需三者字符集一致:
OD -x 或 UltraEdit 查看)-- 查詢 DMP 字符集 (十六進位 0354 為例)
SELECT NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX')) FROM dual; -- ZHS16GBK
-- 資料庫字符集 (最直觀)
SELECT USERENV('language') FROM dual;
-- 輸出:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\NLS_LANGSET NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBKAMERICAN_AMERICA.AL32UTF8# 查看當前 env | grep NLS_LANG # 永久生效 (編輯 .bash_profile) export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 # 立即生效 source ~/.bash_profile
資料庫字符集建立後極難修改,通常需完整重建資料庫。建議新建庫時直接採用 AL32UTF8。若必須修改,參考 Oracle 官方 CSALTER 工具流程,並做完整備份與測試。