專案需儲存數學/單位符號 (m³、μ、α、∑ 等)。Oracle 能否正確存儲取決於**資料庫字元集**與**客戶端 NLS_LANG** 設定。本文記錄 AL32UTF8 環境實測全過程。
# Linux 終端 (VNC 圖形介面測試有效,SecureCRT 可能顯示亂碼)
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
sqlplus scott/tiger
注意:SecureCRT 等終端模擬器若字元集設置不匹配 (如預設 GBK/CP936),會顯示亂碼 (m³ → m魯),但資料庫實際儲存可能正確。驗證以資料庫查詢為準。
SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='NLS_CHARACTERSET';
PROPERTY_VALUE
--------------
AL32UTF8
✅ **AL32UTF8** (Oracle 實作的 UTF-8) 支援所有 Unicode 字元,包含數學符號、希臘字母、CJK 表意文字等。
SQL> CREATE TABLE test_t1 (c1 VARCHAR2(20));
Table created.
SQL> INSERT INTO test_t1 VALUES ('m³');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM test_t1;
C1
--------------------
m³
SQL> SELECT DUMP(c1, 1016) FROM test_t1; -- 16進位檢視內部碼位
DUMP(C1,1016)
--------------
Typ=1 Len=2 CharacterSet=AL32UTF8: 6d, c2b3
6d = 'm' (ASCII)c2 b3 = UTF-8 編碼的 U+00B3 (³)| 字元集 | 支援範圍 | 建議場景 |
|---|---|---|
| AL32UTF8 | 完整 Unicode (UTF-8) | **新建資料庫首選**,支援所有語言與符號 |
| UTF8 | Unicode 3.0 子集 (UTF-8 舊版實作) | 舊版相容,不支援補充平面字元 |
| EL8ISO8859P7 | 希臘文 + 西歐文 | 僅需希臘字母的舊系統 |
| ZHS16GBK / ZHT16MSWIN950 | 簡/繁體中文 | **不支援** 數學符號、希臘字母 |
| WE8MSWIN1252 / WE8ISO8859P1 | 西歐語系 | **不支援** 中文、數學符號 |
核心結論:資料庫字元集在 CREATE DATABASE 時確定,**事後無法修改** (需重建資料庫)。若現有庫為非 Unicode 字元集 (如 ZHS16GBK),需規劃遷移至 AL32UTF8 (DMU 工具輔助) 才能正確儲存特殊符號。
NLS_LANG = _.
.AL32UTF8 或 .UTF8。.ZHS16GBK;PowerShell/Windows Terminal 可用 UTF-8 → 設 .AL32UTF8。-- 1. 檢查資料庫字元集
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';
-- 2. 測試插入特殊符號
CREATE TABLE symbol_test (sym VARCHAR2(10), descr VARCHAR2(50));
INSERT INTO symbol_test VALUES ('m³', '立方米');
INSERT INTO symbol_test VALUES ('μ', '微米/微秒');
INSERT INTO symbol_test VALUES ('αβγ', '希臘字母');
INSERT INTO symbol_test VALUES ('∑∫√', '數學運算符');
COMMIT;
-- 3. 驗證內部碼位
SELECT sym, DUMP(sym, 1016) AS utf8_hex, LENGTHB(sym) AS bytes
FROM symbol_test;
-- 4. 應用層讀取驗證 (Java/Python/Node.js 等) 需確保連線字元集 = AL32UTF8