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

Oracle 字符集 NLS_LANG 與 NLS_CHARACTERSET 測試報告與亂碼根因分析

     編輯:MySQL 資料庫相關知識

核心概念區分

參數層級作用註冊表/環境變數
NLS_LANGClient客戶端字符集、語言、地區;決定 SQL*Plus 顯示與匯出編碼HKLM\Software\Oracle\HOME0\NLS_LANG / $NLS_LANG
NLS_CHARACTERSETDatabase資料庫內部儲存編碼;建庫時固定,不可變SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

測試矩陣與結果

案例Client NLS_LANGDB Character Set中文顯示建表含中文匯出/匯入
1ZHS16GBKZHS16GBK✅✅✅
2ZHS16GBKUS7ASCII❌❌⚠️ 轉換警告
3US7ASCIIUS7ASCII✅ (純 ASCII)❌❌
4ZHS16GBKUS7ASCII❌❌⚠️ 轉換警告

關鍵結論

  1. Client 與 DB 字符集必須一致(或 Client 為超集),否則中文亂碼。
  2. NLS_LANG 決定 EXP 匯出檔編碼;IMP 讀取時依檔案標記轉換。
  3. US7ASCII 不支援中文,強行寫入會導致資料損壞。
  4. Oracle 9i+ 強制要求 Client/Server 字符集相容,否則拋 ORA-12705。

驗證查詢

SELECT * FROM V$NLS_PARAMETERS;
SELECT * FROM NLS_DATABASE_PARAMETERS;
SELECT * FROM PROPS$ WHERE NAME='NLS_CHARACTERSET';

遺留問題

案例 3:Client/DB 皆為 US7ASCII,為何建表含中文後無法正常顯示?
→ 根因:US7ASCII 無中文字碼對應,寫入時已遺失資訊,非顯示層問題。

最佳實務

  • 新建庫統一採用 AL32UTF8 (UTF-8),Client 同設 NLS_LANG=.AL32UTF8。
  • 舊系統 GBK 遷移至 UTF8 需用 DMU (Database Migration Assistant for Unicode) 逐字轉換。
  • 應用層統一使用 Unicode (Java String / .NET String / Python 3 str),避免編碼轉換鏈條過長。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved