使用 SQL*Plus 連線 Oracle 時出現 ???? 或亂碼,主因是資料庫字元集與客戶端 NLS_LANG 設定不匹配。本文提供各作業系統、Shell 環境的標準設定值與驗證步驟。
NLS_LANG = <語言>_<地區>.<字元集> 三部分組成,字元集必須與資料庫字元集一致(或為其超集)。
-- 查詢資料庫字元集
SELECT * FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
-- 典型輸出:AL32UTF8, ZHS16GBK, JA16SJIS, WE8ISO8859P1
| 資料庫字元集 | 建議 NLS_LANG 值 | 適用語系 |
|---|---|---|
| AL32UTF8 / UTF8 | AMERICAN_AMERICA.AL32UTF8 | 通用(含中日韓) |
| ZHS16GBK | SIMPLIFIED CHINESE_CHINA.ZHS16GBK | 簡體中文 |
| ZHT16BIG5 / ZHT16MSWIN950 | TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 | 繁體中文 |
| JA16SJIS / JA16SJISTILDE | JAPANESE_JAPAN.JA16SJIS | 日文 |
| KO16MSWIN949 | KOREAN_KOREA.KO16MSWIN949 | 韓文 |
| WE8ISO8859P1 / WE8MSWIN1252 | AMERICAN_AMERICA.WE8MSWIN1252 | 西歐語系 |
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
# 永久生效:寫入 ~/.bash_profile 或 /etc/profile
setenv NLS_LANG AMERICAN_AMERICA.AL32UTF8
# 永久生效:寫入 ~/.cshrc
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
NLS_LANG = AMERICAN_AMERICA.AL32UTF8| 版本 | 變數 | 路徑範例 |
|---|---|---|
| 10g/11g | ORA_NLS33 | $ORACLE_HOME/ocommon/nls/data |
| 12c+ | ORA_NLS10 | $ORACLE_HOME/nls/data |
# Bash 範例
export ORA_NLS10=$ORACLE_HOME/nls/data
NLS_LANG 後重新啟動 SQL*Plus。SELECT * FROM nls_session_parameters WHERE parameter='NLS_LANG'; 確認 Session 級參數已套用。AMERICAN_AMERICA)而省略字元集 → 預設使用 US7ASCII,導致非 ASCII 字元全變 ?。HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_... 下也有 NLS_LANG,若環境變數未設定會讀取註冊表值,需同步修改。