US7ASCII、WE8ISO8859P1 (單位元組、效能最優、空間最小)AL32UTF8** (標準 Unicode、無轉換損耗、未來擴充無憂)
客戶端輸入 (本地編碼 GBK/Big5/Shift-JIS)
↓ 應用程式偵測 Locale → 轉 Unicode (UTF-16/UTF-8)
↓ 網路傳輸 (UTF-8)
資料庫存儲 (AL32UTF8) ← 無轉換,透明寫入
↓ 查詢讀取 (UTF-8)
↓ 應用程式依客戶 Locale → 轉本地編碼
↓ 顯示給用戶
客戶端輸入 (本地編碼 GBK) → NLS_LANG=ZHS16GBK
↓ 網路傳輸
資料庫 (AL32UTF8) → **自動轉換 GBK → UTF-8** → 存儲
↓ 查詢 → **自動轉換 UTF-8 → GBK** → 回傳
↓ 客戶端顯示 (GBK 環境正常)
| 場景 | 客戶端 NLS_LANG | 資料庫字元集 | 結果 |
|---|---|---|---|
| 應用層轉碼 | AL32UTF8 (或 .UTF8) | AL32UTF8 | **無轉換、最高效** |
| 資料庫層轉碼 | ZHS16GBK / ZHT16BIG5 | AL32UTF8 | 自動雙向轉換、相容舊應用 |
| 錯誤示範 | AL32UTF8 | ZHS16GBK | 資料庫無法儲存非 GBK 字元、插入報錯 |
| 危險示範 | ZHS16GBK | US7ASCII | **隱性亂碼** : 實存 GBK、庫以為 ASCII、跨系統必亂 |
NLS_LANG 設定統一且正確V$NLS_PARAMETERS、V$SESSION_CONNECT_INFO 確認實際字元集與預期一致ZHS16GBK → AL32UTF8:**使用 DMU (Database Migration Assistant for Unicode)**,掃描不可轉換列 → 人工清洗 → 離線/線上轉換 → 全量驗證ALTER DATABASE CHARACTER SET (極高風險、需停機、易損壞資料)字元集選型無標準答案,**「應用層轉碼 + AL32UTF8」是現代最佳實踐**,「資料庫層轉碼」是遷移期保護傘。核心在於:**NLS_LANG 與資料庫字元集的明確契約**,任何一端配錯都是定時炸彈。