首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 8i SQL*Plus Worksheet 中文亂碼根因與修復:Java 驅動程式 NLS 設定遺漏

     編輯:Oracle 資料庫基礎

Oracle 8i 引入 Java 架構後,SQL*Plus Worksheet(圖形化工具)出現中文亂碼,而傳統 SQL*Plus(非 Java)卻正常。根因在於 Java 程式不讀取 NLS_LANG 登錄設定,需另行配置 dbaPPScfg.properties。本文詳細記錄問題重現、根因分析與修復步驟。

問題現象

  • 安裝 Oracle 8i 選擇 ZHS16GBK 簡體中文字元集
  • SQL*Plus(命令列)中文顯示、查詢結果正常
  • SQL*Plus Worksheet 介面與查詢結果全為亂碼

排查過程與證據鏈

1. 資料庫字元集確認

SQL> SELECT userenv('language') FROM dual;
USERENV('LANGUAGE')
-------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK

✅ 資料庫端正確。

2. Client NLS_LANG 登錄確認

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG
= AMERICAN_AMERICA.ZHS16GBK

✅ Client 端正確。

3. 關鍵差異:Java vs 非 Java 程式

  • 非 Java 程式(SQL*Plus、Exp/Imp):讀取 NLS_LANG(Unix 環境變數 / Windows 登錄)決定 Client 字元集
  • Java 程式(SQL*Plus Worksheet、Enterprise Manager 工具):忽略 NLS_LANG,需專屬配置檔

此為 Oracle 8i 大量採用 Java 驅動導致的架構副作用。

修復方案:編輯 dbaPPScfg.properties

檔案位置

$ORACLE_HOME\sysman\config\dbaPPScfg.properties

修改項目

  1. 找到 # SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    → 取消註解,改為:
    SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
  2. (Windows 專屬)找到 # SQLPLUS_SYSTEMROOT=c:\\WINNT40
    → 取消註解,改為實際系統根目錄,例如:
    SQLPLUS_SYSTEMROOT=d:\\WINNT

未修改 SYSTEMROOT 的後果

Enterprise Manager 連線時出現:

ORA-12560: TNS:protocol adapter error
ORA-12545: Connect failed because target host or object does not exist

驗證

  1. 儲存檔案,重新啟動 SQL*Plus Worksheet
  2. 中文介面與查詢結果恢復正常顯示

延伸說明

  • 同樣原理適用於 Oracle Enterprise Manager 內所有 Java 工具
  • Oracle 9i/10g 後續版本同樣存在此配置檔機制,路徑可能變更(如 $ORACLE_HOME/sysman/config/emoms.properties)
  • JDBC Thin 驅動程式連線時可在連線字串指定 oracle.jdbc.defaultNChar=true 等屬性

結語

亂碼本質是編碼協商失敗。Oracle 8i 引入 Java 工具鏈卻未同步 NLS 配置機制,導致 NLS_LANG 失效於 Java 程式。記住:Java 工具看 properties,非 Java 工具看 NLS_LANG,雙軌配置缺一不可。

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