首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 儲存特殊符號 (如 m³ 立方米) 的字元集配置與驗證實測

     編輯:Oracle 教學

Oracle 儲存特殊符號 (如 m³ 立方米) 的字元集配置與驗證實測

專案需儲存數學/單位符號 (m³、μ、α、∑ 等)。Oracle 能否正確存儲取決於**資料庫字元集**與**客戶端 NLS_LANG** 設定。本文記錄 AL32UTF8 環境實測全過程。


環境準備 (關鍵:客戶端 NLS_LANG)

# 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 表意文字等。


實測存儲 m³ (U+00B3 SUPERSCRIPT THREE)

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 (³)
  • 長度 2 Bytes,完美儲存。

官方支援字元集對照 (MOS Doc ID 1060862.6)

字元集支援範圍建議場景
AL32UTF8完整 Unicode (UTF-8)**新建資料庫首選**,支援所有語言與符號
UTF8Unicode 3.0 子集 (UTF-8 舊版實作)舊版相容,不支援補充平面字元
EL8ISO8859P7希臘文 + 西歐文僅需希臘字母的舊系統
ZHS16GBK / ZHT16MSWIN950簡/繁體中文**不支援** 數學符號、希臘字母
WE8MSWIN1252 / WE8ISO8859P1西歐語系**不支援** 中文、數學符號
核心結論:資料庫字元集在 CREATE DATABASE 時確定,**事後無法修改** (需重建資料庫)。若現有庫為非 Unicode 字元集 (如 ZHS16GBK),需規劃遷移至 AL32UTF8 (DMU 工具輔助) 才能正確儲存特殊符號。

客戶端 NLS_LANG 設定原則

NLS_LANG = _.
  • Client Character Set 必須與終端/應用程式實際編碼一致。
  • Linux 終端通常為 UTF-8 → 設 .AL32UTF8 或 .UTF8。
  • Windows CMD 預設 CP936 (GBK) → 設 .ZHS16GBK;PowerShell/Windows Terminal 可用 UTF-8 → 設 .AL32UTF8。
  • JDBC/ODBC/OLEDB 驅動程式通常自動處理字元集轉換,**無需**設定 NLS_LANG 環境變數。

驗證腳本 (可直接跑)

-- 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved