Oracle 數據庫字符集決定了數據存儲的字節編碼。安裝時未正確選擇字符集 (如預設 US7ASCII 或 WE8ISO8859P1) 導致中文存儲為亂碼 (顯示「靠」等)。本文詳述修改字符集的正確姿勢、內部機制、數據遷移風險、以及**最佳實踐:重建數據庫/導入導出** 而非直接 ALTER DATABASE。
| 字符集 | 類型 | 中文支持 | 典型場景 |
|---|---|---|---|
US7ASCII | 單字節 7-bit | ❌ 無 | 早期默認,純英文 |
WE8ISO8859P1 | 單字節 8-bit | ❌ 無 (僅西歐語) | 西歐默認 |
ZHS16GBK | 雙字節 (GBK) | ✅ 簡體中文 | 簡體中文環境舊標準 |
ZHT16BIG5 | 雙字節 (Big5) | ✅ 繁體中文 | 繁體中文環境舊標準 |
AL32UTF8 | 多字節 (UTF-8) | ✅ 全球語言 (含 Emoji) | **現代應用首選**,Oracle 12c+ 默認 |
語言_地區.字符集 (如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 或 AMERICAN_AMERICA.AL32UTF8)。**客戶端 NLS_LANG 必須與數據庫字符集一致或兼容**。
-- 極度危險,僅限空數據庫或極少數兼容情況
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
-- 或
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
**核心原則**:創建新目標字符集數據庫 → 導出源數據 → 導入新庫 → 驗證 → 切換應用。
CREATE DATABASE newdb CHARACTER SET AL32UTF8 NATIONAL CHARACTER SET AL16UTF16;
-- 或 DBCA 圖形界面創建
expdp system/pass@srcdb \
DIRECTORY=dp_dir \
DUMPFILE=srcdb_%U.dmp \
LOGFILE=expdp_srcdb.log \
FULL=Y \
PARALLEL=4 \
COMPRESSION=ALL \
METRICS=Y
impdp system/pass@newdb \
DIRECTORY=dp_dir \
DUMPFILE=srcdb_%U.dmp \
LOGFILE=impdp_newdb.log \
FULL=Y \
PARALLEL=4 \
TABLE_EXISTS_ACTION=SKIP \
EXCLUDE=STATISTICS \
METRICS=Y
EXEC DBMS_STATS.GATHER_DATABASE_STATS;SELECT col FROM table WHERE col LIKE '%中文%';NLS_LANG=.AL32UTF8 (JDBC 驅動 12.2+ 自動檢測,無需設置)。
csscan system/pass@srcdb FULL=Y TOCHAR=AL32UTF8 ARRAY=1024000 PROCESS=4
scan.txt、scan.err,**導入前必跑**,量化風險。若源字符集為 **嚴格子集** (如 US7ASCII → AL32UTF8, WE8ISO8859P1 → AL32UTF8) 且 **CSSCAN 報告無數據損失**,可使用內部工具 CSALTER 就地轉換 (無導出導入):**需 Oracle 支持介入,風險極高,生產環境一般不建議**。
| 客戶端類型 | 正確配置 |
|---|---|
| JDBC (ojdbc8.jar 12.2+) | **無需設置 NLS_LANG**,驅動自動協商 AL32UTF8。舊版驅動設置 -Doracle.jdbc.defaultNChar=true。 |
| ODP.NET / OCI | 註冊表/環境變量 NLS_LANG=.AL32UTF8 (點號前綴表示僅設置字符集)。 |
| SQL*Plus / exp/imp | 環境變量 NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8 (或 .AL32UTF8)。 |
| Python cx_Oracle | 連接參數 encoding="UTF-8", nencoding="UTF-8" (cx_Oracle 8+)。 |
┌─────────────────────┐
│ 數據庫是否為空/極小? │
└──────────┬──────────┘
│
┌──────────────┴──────────────┐
▼ ▼
是 否
│ │
┌──────────┴──────────┐ ┌─────────┴─────────┐
▼ ▼ ▼ ▼
直接 ALTER DATABASE 重建庫/導入導出 CSSCAN 評估 導出導入 (Data Pump)
INTERNAL_USE (風險可控) (標準流程) ├─ 無損失 → CSALTER (慎用)
└─ 有損失 → 必須導出導入
字符集遷移是核心數據庫變更,**謹慎規劃、充分測試、備份回滾方案就緒**,方能保障數據資產安全平滑過渡。