字元集決定資料庫儲存、顯示、排序的字符編碼。修改資料庫字元集屬高風險操作,必須在維護窗口、完整備份後進行。本文提供標準流程:查看現況 → 關閉資料庫 → MOUNT 模式修改 → 重啟驗證,並說明用戶端 NLS_LANG 設定。
SELECT userenv('language') FROM dual;
-- 結果範例:SIMPLIFIED CHINESE_CHINA.AL32UTF8
格式:語言_地區.字元集。重點關注最後的字元集名稱 (如 AL32UTF8、ZHS16GBK、WE8ISO8859P1)。
前提:目標字元集為現有字元集的**超集** (如 ZHS16GBK → AL32UTF8),否則會導致資料截斷/亂碼。若非超集,需用 CSALTER 腳本或匯出/匯入重建。
-- 1. 以 SYSDBA 登入
CONN / AS SYSDBA
-- 2. 正常關閉
SHUTDOWN IMMEDIATE;
-- 3. 啟動到 MOUNT 狀態
STARTUP MOUNT;
-- 4. 啟用受限會話 (防止一般用戶連入)
ALTER SYSTEM ENABLE RESTRICTED SESSION;
-- 5. 停用背景作業 (避免干擾)
ALTER SYSTEM SET job_queue_processes = 0 SCOPE=MEMORY;
ALTER SYSTEM SET aq_tm_processes = 0 SCOPE=MEMORY;
-- 6. 開啟資料庫
ALTER DATABASE OPEN;
-- 7. 修改字元集 (INTERNAL_USE 關鍵字跳過超集檢查,風險自負)
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
-- 8. 關閉並正常重啟
SHUTDOWN IMMEDIATE;
STARTUP;
-- 9. 驗證
SELECT userenv('language') FROM dual;
客戶端 (SQL*Plus、JDBC、OCI 應用) 必須設定正確的 NLS_LANG,格式:
NLS_LANG = <語言>_<地區>.<字元集>
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
# 或繁體中文環境
export NLS_LANG="TRADITIONAL CHINESE_TAIWAN.AL32UTF8"
NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\NLS_LANG| 風險 | 說明 |
|---|---|
| 資料截斷 | 目標字元集單字元儲存長度 < 來源字元集 (如 AL32UTF8 中文 3 bytes,ZHS16GBK 2 bytes),超長資料會被截斷 |
| 資料損壞 | 非超集轉換會導致字符映射錯誤,產生亂碼或 ORA-12713 |
| 應用相容性 | 舊應用可能假設特定字元集編碼,修改後需全面回歸測試 |
EXPDP / IMPDP 遷移資料,自動處理字元集轉換。?/rdbms/admin/csalter.plb),支援部分非超集轉換,需嚴格遵循文檔流程。