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

解決 Oracle 8i JDBC 更新 VARCHAR2 與 DATE 型態時出現亂碼問題

     編輯:Oracle 資料庫基礎

雖然 Oracle 8i 已屬舊版本,部分維護專案仍在使用。當透過 JDBC 同時更新包含 VARCHAR2 與 DATE 型態的資料列時,VARCHAR2 欄位可能出現亂碼(中英文皆有可能,甚至同一欄位前半正常後半亂碼),但同樣 SQL 在 SQL*Plus 執行卻正常。這通常是用戶端 NLS 設定與資料庫字元集不一致導致。

環境與現象

  • 作業系統:Windows XP
  • 資料庫:Oracle 8i 8.1.6.0.0
  • 現象:JDBC 更新含 VARCHAR2 與 DATE 的資料列時 VARCHAR2 亂碼;SQL*Plus 執行正常。

根本原因

JDBC 驅動程式依據用戶端登錄機碼 NLS_LANG 決定字元集轉換。若登錄值與資料庫實際字元集(如 ZHS16GBK)不符,資料傳輸時會錯誤編碼/解碼,產生亂碼。

解決步驟

  1. 查詢資料庫 NLS 參數
    以 DBA 權限執行:
SELECT p1.VALUE || '_' || p2.VALUE || '.' || p3.VALUE
FROM (SELECT VALUE FROM sys.props$ WHERE name='NLS_LANGUAGE') p1,
     (SELECT VALUE FROM sys.props$ WHERE name='NLS_ISO_CURRENCY') p2,
     (SELECT VALUE FROM sys.props$ WHERE name='NLS_CHARACTERSET') p3;

範例結果:AMERICAN_AMERICA.ZHS16GBK

  1. 修改登錄機碼
    開啟 regedit,定位 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0(若有 HOME1、HOME2… 全部修改),將 NLS_LANG 數值資料改為上一步查得的字串(如 AMERICAN_AMERICA.ZHS16GBK)。若缺少該值,新建字串值命名為 NLS_LANG。
  2. 重啟電腦 使登錄生效。
  3. 更換 JDBC 驅動程式
    若問題持續,請捨棄「通用版」驅動(號稱 8i/9i/10g 通用),改用 Oracle 安裝目錄下 jdbc/lib 附屬的 classes12.zip 或 ojdbc14.jar(視 JDK 版本)。

驗證

重新啟動應用程式,執行相同更新操作,亂碼問題應解決。若仍失敗,檢查資料庫端 NLS_CHARACTERSET 是否真為 ZHS16GBK,並確認用戶端作業系統區域設定為中文(繁體/簡體)。

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