錯誤現象
在 Linux 環境執行 exp 匯出時,大量出現警告:
Exporting questionable statistics.
雖不影響資料完整性,但表示字元集轉換可能異常,導致統計資訊不可信。
環境說明
- 來源資料庫 (B 機) 與目標匯出機 (A 機) 均為 Linux
- 資料庫字元集:
ZHS16GBK (雙方一致)
- 作業系統 Locale:A 機為簡體中文 (zh_CN.GB18030/zh_CN.UTF-8),B 機同
排查過程
- 確認資料庫字元集一致:
SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
-- 或
SELECT * FROM v$nls_parameters WHERE parameter = 'NLS_CHARACTERSET';
-- 結果均為 ZHS16GBK
- 懷疑作業系統 Locale 干擾 Oracle Client 字元集判斷。
- 在 A 機 Shell 設定
NLS_LANG 環境變數後重新匯出,警告消失:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
exp user/password@sid file=0320.dmp
核心原理
| 層級 | 設定來源 | 優先序 |
| 資料庫端 | NLS_DATABASE_PARAMETERS (建庫時固定) | 基準 |
| Client 端 | NLS_LANG 環境變數 / 註冊表 | 最高 (覆蓋所有) |
| Session 端 | ALTER SESSION SET NLS_... | 次高 |
| 作業系統 | LANG, LC_ALL 等 Locale | Client 未設定時參考 |
關鍵點: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. 是基本功。
- 上一篇文章: Oracle 表空間整理實戰筆記:Undo 縮減後檔案殘留問題與徹底清除驗證
- 下一篇文章: Oracle 檔案上傳三大技術方案對比:mod_plsql、9iAS Tag Library、JDBC 實作詳解
Copyright ©
程式碼之家 All Rights Reserved