首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 客戶端 NLS_LANG 設定完整指南:字元集、語言、地區三要素詳解

     編輯:Oracle 資料庫相關知識

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 CMDecho %NLS_LANG%AMERICAN_AMERICA.ZHS16GBK
Windows PowerShell$env:NLS_LANG同上
Linux/Unix Shellecho $NLS_LANG 或 env | grep NLS_LANGAMERICAN_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.ZHT16HKSCSCP950 (chcp 950)
簡體中文 Windows (大陸)SIMPLIFIED CHINESE_CHINA.ZHS16GBKCP936 (chcp 936)
Unicode 應用 (Java/.NET/Python 3)AMERICAN_AMERICA.AL32UTF8UTF-8 終端機
Linux 簡體中文環境SIMPLIFIED CHINESE_CHINA.ZHS16GBKzh_CN.GBK locale
Linux 繁體中文環境TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950zh_TW.Big5 locale

Windows 永久設定(登錄檔)

  1. 開啟 regedit
  2. 定位 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME\NLS_LANG(ID 為 0、1、2... 視安裝順序)
  3. 修改字串值為目標值,如 TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
  4. 重新啟動所有 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 filesNLS_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 決定,兩者協同工作才能正確轉碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved