字節資料解釋符號集合,有大小與包含關係。關鍵參數 NLS_LANG = LANGUAGE_TERRITORY.CHARSET(如 AMERICAN_AMERICA.ZHS16GBK),第三部分決定資料庫字符集。
| 對象 | 查詢方式 |
|---|---|
| Server 端 | SELECT USERENV('LANGUAGE') FROM DUAL; 或 SELECT * FROM V$NLS_PARAMETERS |
| DMP 檔 | 第 2-3 位元組為字符集 ID。小檔 UltraEdit 開啟;大檔 cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6 取十六進制,再 SELECT NLS_CHARSET_NAME(TO_NUMBER('xxxx','XXXX')) FROM DUAL 解析 |
| Client 端 | Windows:註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME...\NLS_LANG;Unix:echo $NLS_LANG 或 DOS SET NLS_LANG=... |
導入導出要求三者一致。
ZHS16GBK 與 ZHS16CGB231280 無包含關係,理論不支援互轉(實務常強制但風險自負)。AL32UTF8 基於 Unicode,涵蓋最廣,但佔用空間大。SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;
ALTER SYSTEM SET AQ_TM_PROCESSES = 0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE NATIONAL CHARACTER SET ZHS16GBK;
SHUTDOWN IMMEDIATE;
STARTUP;
-- 查目標字符集十六進制
SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'), 'XXXX') FROM DUAL; -- 0354
-- UltraEdit 修改 DMP 第 2-3 位元組為 0354
-- 大檔案需寫程式(Java Stored Procedure 等)修改
CREATE DATABASE ... CHARACTER SET ZHS16GBK)。EXP/IMP 配合 DMP 字符集修改,或中間格式(CSV/Access)轉儲。字符集問題核心在於「三方一致」與「子集→超集」原則。掌握 V$NLS_PARAMETERS 查詢、DMP 位元組修改、標準 ALTER DATABASE 流程,可應對 95% 字符集遷移與亂碼場景。