在 Windows 環境下使用 SQL*Plus 連接 Oracle 資料庫時,中文資料顯示為亂碼(如問號、方塊字元或亂碼符號),修改註冊表後問題依舊存在。
Oracle 客戶端依據 NLS_LANG 環境變數決定字元集轉換方式。若此變數未設定或設定錯誤,客戶端會使用預設字元集(通常為 US7ASCII),導致無法正確解碼資料庫中的中文資料(通常儲存為 ZHS16GBK、AL32UTF8 或 WE8MSWIN1252)。
NLS_LANGSIMPLIFIED CHINESE_CHINA.ZHS16GBK| 資料庫字元集 | 客戶端作業系統 | 建議 NLS_LANG 設定值 |
|---|---|---|
| ZHS16GBK (簡體中文) | Windows (GBK/CP936) | SIMPLIFIED CHINESE_CHINA.ZHS16GBK |
| AL32UTF8 (Unicode) | Windows (UTF-8) | SIMPLIFIED CHINESE_CHINA.AL32UTF8 |
| AL32UTF8 | Linux/macOS (UTF-8) | SIMPLIFIED CHINESE_CHINA.AL32UTF8 |
| WE8MSWIN1252 | Windows 西歐語系 | AMERICAN_AMERICA.WE8MSWIN1252 |
| ZHT16MSWIN950 (繁體中文) | Windows (Big5/CP950) | TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 |
-- 在 SQL*Plus 中執行
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_LANGUAGE';
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
若 NLS_LANGUAGE 顯示 SIMPLIFIED CHINESE,NLS_CHARACTERSET 與資料庫一致,即表示設定正確。
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';.AL32UTF8,且命令提示字元需支援 UTF-8(Win10 建議啟用「Beta 版:使用 Unicode UTF-8 提供全球語言支援」)HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_{OracleHome}\NLS_LANG 是否覆蓋環境變數,若存在請刪除或修改一致這類工具通常內建字元集處理邏輯,不完全依賴 NLS_LANG。SQL*Plus 為純命令列工具,嚴格遵循 NLS_LANG 設定。
# 臨時設定(當前 shell 有效)
export NLS_LANG=SIMPLIFIED_CHINESE_CHINA.AL32UTF8
# 永久設定(加入 ~/.bashrc 或 ~/.zshrc)
echo 'export NLS_LANG=SIMPLIFIED_CHINESE_CHINA.AL32UTF8' >> ~/.bashrc
source ~/.bashrc
AL32UTF8 字元集,支援全語系、表情符號、特殊符號?characterEncoding=UTF-8 或設定 oracle.jdbc.defaultNChar=true