資料庫字元集、客戶端 NLS_LANG、作業系統 Locale 三者不一致導致編碼轉換錯誤。常見情況:資料庫為 WE8ISO8859P1 (西歐),客戶端為 ZHS16GBK 或 AL32UTF8。
US7ASCII 或 ZHS16GBK)// C# 範例:將 ISO-8859-1 轉為系統預設編碼 (GB2312/UTF-8)
public static string Convert8859P1ToGB2312(string s) {
return Encoding.Default.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s));
}
前提:完整備份!
SHUTDOWN IMMEDIATESTARTUP MOUNTALTER SYSTEM ENABLE RESTRICTED SESSIONALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0;ALTER DATABASE OPENALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_\NLS_LANG 值範例:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" # 或寫入 ~/.bash_profile 永久生效
ZHS16GBK、AL32UTF8 (非 UTF-8)NLS_LANG 格式:LANGUAGE_TERRITORY.CHARACTERSET,含空格需雙引號SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');locale -a 或 cat /usr/share/i18n/SUPPORTED| 作業系統 Locale | NLS_LANG 值 |
|---|---|
| 簡體中文 (中國) | SIMPLIFIED CHINESE_CHINA.ZHS16GBK |
| 繁體中文 (台灣) | TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 |
| 英文 (美國) | AMERICAN_AMERICA.WE8MSWIN1252 |
| 日文 | JAPANESE_JAPAN.JA16SJIS |
| 韓文 | KOREAN_KOREA.KO16MSWIN949 |