DUMP(expr, [return_fmt], [start_pos], [length]) 是診斷資料儲存細節的利器:可顯示資料類型碼、長度、字符集、以及原始位元組值。本文完整說明參數、回傳格式、類型碼對照表、中文字元在 UTF8/GBK 下的儲存差異、數字內部編碼邏輯,並附 ASCII 碼對照表。
DUMP(expr [, return_fmt [, start_position [, length ]]])
-- 參數說明
expr : 任意運算式 (欄位、常數、函數結果)
return_fmt : 回傳格式 (預設 10)
8 - 八進位
10 - 十進位 (預設)
16 - 十六進位
17 - 字元顯示 (可列印字元顯示字元,不可列印顯示碼)
1000+以上格式 - 在結果前加上字符集名稱 (如 1010=十進位+字符集, 1016=十六進位+字符集)
start_position : 起始位置 (從 1 開始)
length : 顯示長度
-- 1. 基本字串
SELECT DUMP('abc') FROM dual;
-- Typ=96 Len=3: 97,98,99 (Typ=96 CHAR, Len=3 bytes, ASCII 97=a, 98=b, 99=c)
SELECT DUMP('abc', 16) FROM dual;
-- Typ=96 Len=3: 61,62,63 (十六進位 0x61=a)
SELECT DUMP('abc', 1016) FROM dual;
-- Typ=96 Len=3 CharacterSet=ZHS16GBK: 61,62,63 (含字符集)
SELECT DUMP('abc', 17, 2, 2) FROM dual;
-- Typ=96 Len=3: b,c (從第 2 字元顯示 2 個字元)
| Code | Type | 說明 |
|---|---|---|
| 1 | VARCHAR2 | 變長字串 |
| 2 | NUMBER | 數字 (內部特殊編碼) |
| 8 | LONG | 長文本 (已棄用) |
| 12 | DATE | 日期 (7 位元組內部格式) |
| 23 | RAW | 二進位 |
| 96 | CHAR | 定長字串 |
| 112 | CLOB | 大字元物件 |
| 113 | BLOB | 大二進位物件 |
| 180 | TIMESTAMP | 時間戳 |
| 181 | TIMESTAMP WITH TIME ZONE | 帶時區時間戳 |
| 231 | TIMESTAMP WITH LOCAL TIME ZONE | 本地時區時間戳 |
-- UTF8 資料庫
SELECT DUMP('多多', 1010) FROM dual;
-- Typ=96 Len=6 CharacterSet=UTF8: 229,164,154,229,164,154
-- 每字 3 bytes: E4 B4 9A
-- GBK 資料庫
SELECT DUMP('多多', 1010) FROM dual;
-- Typ=96 Len=4 CharacterSet=ZHS16GBK: 182,224,182,224
-- 每字 2 bytes: B6 E0
Oracle NUMBER 採用可變長科學記號法儲存:1 位元組指數 + 1~20 位元組尾數,最高位為符號位。DUMP 顯示的十進位值為經過轉換的內部碼,不等於原數字。範例:
SELECT DUMP(123) FROM dual; -- Typ=2 Len=2: 194,24 (指數 194=128+66, 尾數 24) SELECT DUMP(-123) FROM dual; -- Typ=2 Len=2: 61,233 (指數 61=128-67, 尾數 233=256-23) SELECT DUMP(0) FROM dual; -- Typ=2 Len=1: 128 (特殊編碼) SELECT DUMP(1.5) FROM dual; -- Typ=2 Len=2: 193,26
| 碼 | 字元 | 碼 | 字元 | 碼 | 字元 | 碼 | 字元 |
|---|---|---|---|---|---|---|---|
| 32 | Space | 48 | 0 | 65 | A | 97 | a |
| 33 | ! | 49 | 1 | 66 | B | 98 | b |
| 34 | " | 50 | 2 | 67 | C | 99 | c |
| 35 | # | 51 | 3 | 68 | D | 100 | d |
| 36 | $ | 52 | 4 | 69 | E | 101 | e |
| 37 | % | 53 | 5 | 70 | F | 102 | f |
| 38 | & | 54 | 6 | 71 | G | 103 | g |
| 39 | ' | 55 | 7 | 72 | H | 104 | h |
| 40 | ( | 56 | 8 | 73 | I | 105 | i |
| 41 | ) | 57 | 9 | 74 | J | 106 | j |
| 42 | * | 58 | : | 75 | K | 107 | k |
| 43 | + | 59 | ; | 76 | L | 108 | l |
| 44 | , | 60 | < | 77 | M | 109 | m |
| 45 | - | 61 | = | 78 | N | 110 | n |
| 46 | . | 62 | > | 79 | O | 111 | o |
| 47 | / | 63 | ? | 80 | P | 112 | p |
ORA-01401: inserted value too large for column 實際位元組長度CHR()、ASCII() 進行字元轉換驗證