在 Oracle 11g 與 10g 遷移專案中,發現同樣的漢字在 11g 佔 2 位元組、10g 卻佔 3 位元組,導致資料匯入失敗。根因並非版本差異,而是字符集編碼不同。本文詳細說明字符集對漢字儲存長度的影響、查詢驗證方法與相關知識點。
| 字符集 | 漢字位元組數 | 典型場景 |
|---|---|---|
ZHS16GBK (SIMPLIFIED CHINESE_CHINA.ZHS16GBK) |
2 位元組 | 中文環境傳統部署、相容性佳 |
AL32UTF8 (SIMPLIFIED CHINESE_CHINA.AL32UTF8) |
3 位元組 | Unicode 標準、多語系支援、現代推薦 |
SELECT USERENV('language') FROM dual;
-- 輸出範例:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SELECT LENGTHB('啊') FROM dual;
-- ZHS16GBK 回傳 2,AL32UTF8 回傳 3
VARCHAR2(20 CHAR) 語義改用字元語義),或統一字符集NLS_LANG 客戶端字符集需與資料庫一致,否則顯示亂碼VARCHAR2(n CHAR)) 而非位元組語義NLS_LANG 設定與資料庫字符集對應(如 AMERICAN_AMERICA.AL32UTF8)