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

sqlldr 導入中文 CSV 亂碼解決方案:NLS_LANG 與 CharacterSet 設定指南

     編輯:關於SqlServer

問題現象

使用 sqlldr 匯入含中文的 CSV 檔案,資料庫呈現 ???? 或亂碼;但直接用 SQL `INSERT` 卻正常。主因是 sqlldr 客戶端字元集轉換設定錯誤。

根本原因

sqlldr 讀取資料檔 → 依客戶端 NLS_LANG 解碼 → 轉換為資料庫字元集 → 寫入。若 NLS_LANG 與資料檔實際編碼不符,解碼階段即產生錯誤字元,後續轉換無力回天。

解決方案(依優先順序)

方法一:正確設定環境變數 NLS_LANG(最推薦)

# Linux/Unix (bash)
export NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950   # Big5 檔案
export NLS_LANG=TRADITIONAL CHINESE_TAIWAN.AL32UTF8          # UTF-8 檔案

# Windows CMD
set NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950

# Windows PowerShell
$env:NLS_LANG = "TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950"

執行 sqlldr 前務必在同一 Shell 設定。驗證方式:echo %NLS_LANG% 或 env | grep NLS_LANG。

方法二:Control File 指定 CHARACTERSET

LOAD DATA
CHARACTERSET ZHT16MSWIN950   -- 或 UTF8, AL32UTF8
INFILE 'data.csv'
INTO TABLE target_table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
( col1, col2, col3 )

優先級高於環境變數,適合腳本自包含部署。

方法三:記事本另存新檔轉換編碼(應急)

  1. 用記事本開啟 CSV。
  2. 「另存新檔」→ 編碼選 ANSI (對應 Big5/CP950) 或 UTF-8 with BOM。
  3. 重新匯入,配合正確 NLS_LANG。

驗證資料庫字元集

SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_CHARACTERSET';
-- 常見結果:AL32UTF8 (推薦)、ZHT16MSWIN950、ZHT16HKSCS

原則:資料檔編碼 = NLS_LANG/CHARACTERSET 設定 = 資料庫字元集或可無損轉換。

常見陷阱

  • CSV 以 UTF-8 儲存,但 NLS_LANG 設為 Big5 → 中文變亂碼。
  • Windows 預設代碼頁 950 (Big5),Linux 預設 UTF-8,跨平台腳本需顯式設定。
  • sqlldr 版本與 Oracle Client 版本不一致,導致 NLS 解析差異。

最佳實務

  1. 統一專案資料檔編碼為 UTF-8 (AL32UTF8),資料庫亦建立為 AL32UTF8。
  2. 部署腳本開頭強制 export NLS_LANG=...AL32UTF8 或 Control File 寫 CHARACTERSET AL32UTF8。
  3. CI/CD 管線中檢查匯入後資料抽樣,自動化驗證中文完整性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved