在 Oracle 資料庫開發與管理中,深入理解數據類型的內部存儲機制至關重要。本文以 Oracle 10g 為基礎,透過實際操作範例,詳細解析字符類型(CHAR、VARCHAR2 等)的存儲特性,並示範如何使用 DUMP 函數查看數據的底層存儲結構,幫助開發人員與 DBA 掌握數據類型的核心行為。
CHAR 為定長字符串類型,最大長度 2000 位元組。當存儲的數據長度不足定義長度時,Oracle 會自動以空格填充至指定長度。這一特性雖然便於固定寬度處理,但也可能造成存儲空間浪費。
SQL> CREATE TABLE test_char (colA CHAR(10));
Table created.
SQL> INSERT INTO test_char VALUES ('a');
1 row inserted.
SQL> INSERT INTO test_char VALUES ('aa');
1 row inserted.
SQL> INSERT INTO test_char VALUES ('aaa');
1 row inserted.
SQL> INSERT INTO test_char VALUES ('aaaa');
1 row inserted.
SQL> INSERT INTO test_char VALUES ('aaaaaaaaaa');
1 row inserted.
-- 超過長度限制會報錯
SQL> INSERT INTO test_char VALUES ('aaaaaaaaaaa');
ORA-12899: value too large for column "PUB_TEST"."TEST_CHAR"."COLA" (actual: 11, maximum: 10)
DUMP 函數可返回數據的內部表示,包括數據類型代碼、長度及原始位元組值:
SQL> SELECT colA, DUMP(colA) FROM test_char;
COLA DUMP(COLA)
----- ----------------------------------------
a Typ=96 Len=10: 97,32,32,32,32,32,32,32,32,32
aa Typ=96 Len=10: 97,97,32,32,32,32,32,32,32,32
aaa Typ=96 Len=10: 97,97,97,32,32,32,32,32,32,32
aaaa Typ=96 Len=10: 97,97,97,97,32,32,32,32,32,32
aaaaaaaaaa Typ=96 Len=10: 97,97,97,97,97,97,97,97,97,97
SQL> SELECT CHR(97) FROM dual; -- 返回 'a'
SQL> SELECT ASCII('a') FROM dual; -- 返回 97
Oracle 的長度單位為位元組。在常見字符集(如 ZHS16GBK)下,一個漢字佔 2 位元組:
SQL> SELECT DUMP('漢') FROM dual;
DUMP('漢')
------------------
Typ=96 Len=2: 186,186
因此,CHAR(10) 最多只能存放 5 個漢字。
CHAR 適合長度固定、變化極小的數據(如身份證號、郵編),但會浪費空間。VARCHAR2,節省存儲並避免隱式填充導致的比較問題。DUMP 函數可快速診斷字符集亂碼、隱藏字符、長度不符等疑難雜癥。