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

Linux 下 Oracle EXP 匯出「Exporting questionable statistics」錯誤排查:NLS_LANG 環境變數設定詳解

     編輯:Oracle 資料庫相關知識

錯誤現象

在 Linux 環境執行 exp 匯出時,大量出現警告:

Exporting questionable statistics.

雖不影響資料完整性,但表示字元集轉換可能異常,導致統計資訊不可信。

環境說明

  • 來源資料庫 (B 機) 與目標匯出機 (A 機) 均為 Linux
  • 資料庫字元集:ZHS16GBK (雙方一致)
  • 作業系統 Locale:A 機為簡體中文 (zh_CN.GB18030/zh_CN.UTF-8),B 機同

排查過程

  1. 確認資料庫字元集一致:
    SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
    -- 或
    SELECT * FROM v$nls_parameters WHERE parameter = 'NLS_CHARACTERSET';
    -- 結果均為 ZHS16GBK
  2. 懷疑作業系統 Locale 干擾 Oracle Client 字元集判斷。
  3. 在 A 機 Shell 設定 NLS_LANG 環境變數後重新匯出,警告消失:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
exp user/password@sid file=0320.dmp

核心原理

關鍵點:exp/imp、sqlplus 等 Client 工具啟動時,若未偵測到 NLS_LANG,會嘗試從 OS Locale 推導 Client 字元集。中文 Locale 推導結果可能為 ZHS16GBK 或 AL32UTF8,與資料庫 ZHS16GBK 不完全匹配,觸發「questionable statistics」警告。

正確的 NLS_LANG 格式

NLS_LANG = <語言>_<地區>.<字元集>
-- 範例:
AMERICAN_AMERICA.ZHS16GBK      -- 英文介面 + GBK 字元集 (推薦)
SIMPLIFIED CHINESE_CHINA.ZHS16GBK -- 中文介面 + GBK
AMERICAN_AMERICA.AL32UTF8      -- UTF8 字元集
  • 語言/地區:決定錯誤訊息、日期/貨幣格式顯示語言
  • 字元集:必須與資料庫字元集一致,否則會發生隱含轉換或資料損毀

永久生效設定方式

Linux/Unix (Shell 配置檔)

# ~/.bash_profile 或 /etc/profile
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

Windows (註冊表)

[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient19c_home1]
"NLS_LANG"="AMERICAN_AMERICA.ZHS16GBK"

應用程式內指定 (最高優先權)

-- Python cx_Oracle
import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.ZHS16GBK'

-- Java JDBC
System.setProperty("oracle.jdbc.defaultNChar", "true"); // 間接影響

驗證設定生效

$ exp help=y 2>&1 | head -5
# 輸出應顯示正確字元集,無 questionable statistics

$ sqlplus -v
# SQL*Plus 版本資訊正常顯示中文無亂碼

延伸:Data Pump (expdp/impdp) 不受 NLS_LANG 影響

  • Data Pump 為 Server-side 作業,直接讀寫資料庫字元集,不經過 Client 字元集轉換。
  • 大量資料遷移強烈建議改用 expdp/impdp,效能更佳且避免字元集問題。

結語

Exporting questionable statistics 的根因是 Client 端 NLS_LANG 未明確設定,導致從 OS Locale 推導字元集與資料庫不符。在所有執行 Oracle Client 工具的環境中,明確設定 NLS_LANG=AMERICAN_AMERICA. 是基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
層級設定來源優先序
資料庫端NLS_DATABASE_PARAMETERS (建庫時固定)基準
Client 端NLS_LANG 環境變數 / 註冊表最高 (覆蓋所有)
Session 端ALTER SESSION SET NLS_...次高
作業系統LANG, LC_ALL 等 LocaleClient 未設定時參考