NLS_LANG 是 Oracle 客戶端最關鍵的環境變數,決定「客戶端字元集」與「資料庫字元集」之間的轉換規則。設定錯誤會導致中文亂碼、資料截斷、ORA-12705 等錯誤。本文詳細拆解三要素、查看方法、常用值對照表、Windows/Linux 永久生效設定。
NLS_LANG 三要素結構
NLS_LANG = _.
| 元素 | 控制內容 | 範例 |
| Language | 錯誤訊息語言、月份/星期名稱 | AMERICAN、SIMPLIFIED CHINESE、TRADITIONAL CHINESE |
| Territory | 貨幣格式、數字分隔、週起始日、日期習慣 | AMERICA、CHINA、TAIWAN、HONG KONG |
| Client Character Set | 客戶端應用程式使用的字元集,**必須與作業系統/終端機編碼一致** | ZHS16GBK、ZHT16MSWIN950、AL32UTF8、WE8MSWIN1252 |
查看目前設定
| 平台 | 指令 | 範例輸出 |
| Windows CMD | echo %NLS_LANG% | AMERICAN_AMERICA.ZHS16GBK |
| Windows PowerShell | $env:NLS_LANG | 同上 |
| Linux/Unix Shell | echo $NLS_LANG 或 env | grep NLS_LANG | AMERICAN_CHINA.ZHS16GBK |
查看資料庫字元集參數
SELECT * FROM v$nls_parameters; -- 執行中參數
SELECT * FROM nls_database_parameters; -- 資料庫實際儲存參數
SELECT userenv('language') FROM dual; -- 當前會話語言/地區/字元集
查詢支援的合法值
SELECT * FROM v$nls_valid_values WHERE parameter IN ('LANGUAGE','TERRITORY','CHARACTERSET');
常用 NLS_LANG 值對照表
| 場景 | NLS_LANG 值 | 適用作業系統碼頁 |
| 繁體中文 Windows (台灣/香港) | TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 或 TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS | CP950 (chcp 950) |
| 簡體中文 Windows (大陸) | SIMPLIFIED CHINESE_CHINA.ZHS16GBK | CP936 (chcp 936) |
| Unicode 應用 (Java/.NET/Python 3) | AMERICAN_AMERICA.AL32UTF8 | UTF-8 終端機 |
| Linux 簡體中文環境 | SIMPLIFIED CHINESE_CHINA.ZHS16GBK | zh_CN.GBK locale |
| Linux 繁體中文環境 | TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 | zh_TW.Big5 locale |
Windows 永久設定(登錄檔)
- 開啟
regedit
- 定位
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME\NLS_LANG(ID 為 0、1、2... 視安裝順序)
- 修改字串值為目標值,如
TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
- 重新啟動所有 Oracle 客戶端程式(SQL*Plus、PL/SQL Developer、應用程式池)
Linux/Unix 永久設定
# ~/.bash_profile 或 ~/.bashrc
export NLS_LANG="TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950"
# 或
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
# 立即生效
source ~/.bash_profile
常見錯誤與排查
| 現象 | 原因 | 解決 |
| 中文顯示亂碼(??? 或 ) | Client Character Set 與終端機實際編碼不符 | 用 chcp (Win) / locale (Linux) 確認實際碼頁,調整 NLS_LANG 最後一段 |
| ORA-12705: Cannot access NLS data files | NLS_LANG 值拼寫錯誤、含空格未加引號、或字元集不在 v$nls_valid_values | 嚴格對照合法值表修正,值含空格需雙引號 |
| 資料寫入資料庫後查詢變問號 | 資料庫字元集不支援該字元(如 US7ASCII 存中文) | 資料庫必須用 AL32UTF8 / ZHS16GBK 等支援目標語系的字元集,不可事後修改 |
| PL/SQL Developer 正常、SQL*Plus 亂碼 | 工具內建字元集轉換、或讀取不同註冊表鍵值 | 統一設定 HOME0、HOME1 所有 NLS_LANG;工具內「視圖→偏好設定→字型」選支援中文字型 |
最佳實務建議
- **新專案統一採用 AL32UTF8**(資料庫字元集、客戶端 NLS_LANG、應用程式編碼、HTML
charset=utf-8),徹底消除跨平台亂碼
- 舊系統若為 ZHS16GBK/ZHT16MSWIN950,客戶端 NLS_LANG **必須與作業系統碼頁完全一致**
- Docker 容器啟動時透過
-e NLS_LANG=... 注入,避免映像內寫死
- CI/CD 管線中設定統一 NLS_LANG,確保部署一致性
NLS_LANG 不是「設定資料庫字元集」,而是「宣告客戶端使用何種編碼」。資料庫字元集由 CREATE DATABASE ... CHARACTER SET AL32UTF8 決定,兩者協同工作才能正確轉碼。