理解數據類型的物理存儲特性,是設計高性能表結構的基石。本文以 Oracle 10g 為基準,通過 DUMP 函數實測 CHAR 定長特性,揭示空間浪費真相,為類型選擇提供量化依據。
TYP=96。CREATE TABLE test_char (col_a CHAR(10));
INSERT INTO test_char VALUES ('a');
INSERT INTO test_char VALUES ('aa');
INSERT INTO test_char VALUES ('aaa');
INSERT INTO test_char VALUES ('aaaa');
INSERT INTO test_char VALUES ('aaaaaaaaaa'); -- 滿 10 字節
-- INSERT INTO test_char VALUES ('aaaaaaaaaaa'); -- ORA-12899: value too large
SELECT col_a, DUMP(col_a) FROM test_char;
輸出解讀:
| 數據 | DUMP 輸出 | 解析 |
|---|---|---|
| a | Typ=96 Len=10: 97,32,32,32,32,32,32,32,32,32 | 1 個有效字節 + 9 個空格(0x20) |
| aa | Typ=96 Len=10: 97,97,32,32,32,32,32,32,32,32 | 2 個有效 + 8 空格 |
| aaa | Typ=96 Len=10: 97,97,97,32,32,32,32,32,32,32 | 3 有效 + 7 空格 |
| aaaa | Typ=96 Len=10: 97,97,97,97,32,32,32,32,32,32 | 4 有效 + 6 空格 |
| aaaaaaaaaa | Typ=96 Len=10: 97,97,97,97,97,97,97,97,97,97 | 無填充,滿長度 |
LEN=10 恒定,與實際內容無關。CHAR 比較時**不忽略尾部空格**,'a' = 'a ' 為 TRUE,但 VARCHAR2 則為 FALSE。CHR(97) → 'a':ASCII 碼轉字符ASCII('a') → 97:字符轉 ASCII 碼