雖然 Oracle 8i 已屬舊版本,部分維護專案仍在使用。當透過 JDBC 同時更新包含 VARCHAR2 與 DATE 型態的資料列時,VARCHAR2 欄位可能出現亂碼(中英文皆有可能,甚至同一欄位前半正常後半亂碼),但同樣 SQL 在 SQL*Plus 執行卻正常。這通常是用戶端 NLS 設定與資料庫字元集不一致導致。
JDBC 驅動程式依據用戶端登錄機碼 NLS_LANG 決定字元集轉換。若登錄值與資料庫實際字元集(如 ZHS16GBK)不符,資料傳輸時會錯誤編碼/解碼,產生亂碼。
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
regedit,定位 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0(若有 HOME1、HOME2… 全部修改),將 NLS_LANG 數值資料改為上一步查得的字串(如 AMERICAN_AMERICA.ZHS16GBK)。若缺少該值,新建字串值命名為 NLS_LANG。jdbc/lib 附屬的 classes12.zip 或 ojdbc14.jar(視 JDK 版本)。重新啟動應用程式,執行相同更新操作,亂碼問題應解決。若仍失敗,檢查資料庫端 NLS_CHARACTERSET 是否真為 ZHS16GBK,並確認用戶端作業系統區域設定為中文(繁體/簡體)。