問題現象
- 數據庫查詢結果正常顯示中文。
- SQL 窗口輸入中文顯示方框/亂碼。
- 設置環境變量 `NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK` 後反而導致系統字體缺失、遊戲無法運行。
根因分析
- PL/SQL Developer 為 32 位程序,需 32 位 Oracle Client (Instant Client) 支持。
- 字體回退機制失效:編輯器字體 (如 Courier New) 不含中文字形,系統未正確回退到微軟雅黑/宋體。
- NLS_LANG 設置錯誤或衝突:系統級環境變量影響所有 Oracle 客端,若數據庫字符集為 `AL32UTF8`,客戶端應設 `AMERICAN_AMERICA.AL32UTF8` 或 `SIMPLIFIED CHINESE_CHINA.AL32UTF8`,而非 `ZHS16GBK` (簡體中文 GBK)。
- 系統區域設置非中文:Windows「區域與語言」→「管理」→「非 Unicode 程序語言」未設置為中文,導致 ANSI 應用 (含舊版 PL/SQL) 字符集解析錯誤。
標準解決流程 (按優先級)
第一步:修正系統區域設置 (最關鍵,解決 90% 情況)
- 控制面板 → 時鐘和區域 → 區域 → 管理 選項卡。
- 「非 Unicode 程序的語言」點擊「更改系統區域設置」。
- 選擇 **中文 (簡體,中國)**,勾選「Beta 版: 使用 Unicode UTF-8 提供全球語言支持」(Win10 1903+)。
- **重啟電腦** 生效。
第二步:配置 PL/SQL Developer 字體
- 工具 → 首選項 → 用戶介面 → 字體。
- 編輯器字體選 **Consolas** (英文) + **微軟雅黑** (中文回退) 或直接選 **微軟雅黑**、**等線**、**Sarasa Mono SC** (等寬中英文)。
- 大小 10-12pt,應用並重啟 PL/SQL。
第三步:設置正確的 NLS_LANG (僅當前用戶環境變量)
- 右鍵「此電腦」→ 屬性 → 高級系統設置 → 環境變量。
- **用戶變量** (非系統變量) 新建:
變量名:`NLS_LANG`
變量值:`SIMPLIFIED CHINESE_CHINA.AL32UTF8` (若數據庫字符集為 UTF8)
或 `SIMPLIFIED CHINESE_CHINA.ZHS16GBK` (若數據庫確為 GBK,較少見)
- **不要**在系統變量設置,避免影響其他軟件。
- 重啟 PL/SQL Developer 生效。
第四步:驗證 Oracle Client 位數匹配
- PL/SQL Developer 32 位 → 必須安裝 32 位 Oracle Instant Client (basic + sqlplus)。
- 64 位數據庫服務端無關,客戶端位數由開發工具決定。
- 配置 `ORACLE_HOME` 指向 32 位 Client 目錄,`PATH` 前置 `%ORACLE_HOME%`。
避坑指南:為什麼你的操作導致字體缺失、遊戲報錯
- 在**系統變量**設置 `NLS_LANG` 影響全局所有 Oracle 相關進程,甚至干擾非 Oracle 程序的字符集判斷。
- 修改系統區域設置時未重啟,或勾選 Beta UTF-8 導致舊版 ANSI 應用 (如某些遊戲啟動器) 解碼失敗。
- 誤刪/禁用系統字體 (如 `msyh.ttc` 微軟雅黑) 導致回退失敗。
驗證腳本
```sql
-- 在 PL/SQL 窗口執行
SELECT USERENV('LANGUAGE') FROM DUAL;
-- 輸出應包含 AL32UTF8 或 ZHS16GBK,與 NLS_LANG 一致
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER LIKE '%LANG%' OR PARAMETER LIKE '%TERRITORY%';
```