參考
《Oracle dump函數》
《oracle dump詳解》
Oracle函數 DUMP(隨記)
語法
DUMP( expr [ ,return_fmt [,start_position] [,length] ] )
含義
-
expr:指要分析的表達式(數字或字符串等,可以是各個類型的值)
-
return_fmt:返回參數的格式,分爲:
1)8:以 8進制 返回結果值
2)10:以 10進制 返回結果值 默認值
3)16:以 16進制 返回結果值SQL> select dump(16,16) from dual; DUMP(16,16) ------------------------------------ Typ=2 Len=2: c1,11 #Typ=2: 表示number類型 #Len=2:長度爲2 #c1: # number類型正數的最高位是個位的話,則最高位表示位爲C1 # 參考《Oracle基本數據類型存儲格式淺析(二)——數字類型》 #11:=10+1 10(16)=16
4)17:以 單字符 的形式返回結果值,否則字符以16進制數據返回。
SQL> select dump('nahfnaSF vaKEgu525234',17) from dual; DUMP('NAHFNASFVAKEGU',17) -------------------------------------------------------------------------------- Typ=96 Len=15: n,a,h,f,n,a,S,F, ,v,a,K,E,g,u
5)1000:
return_fmt
加上1000實現返回字符集信息。SQL> select dump('abc',1010) from dual; DUMP('ABC',1010) -------------------------------------------------------------------------------- Typ=96 Len=3 CharacterSet=AL32UTF8: 97,98,99
-
start_position:開始進行返回的字符串位置
-
length:需要返回的字符串長度
返回值
類型 <[長度]>,符號/指數位 [數字1,數字2,數字3,…,數字20]
含義
-
類型:例如Number型,Type=2 (類型代碼可以從Oracle的文檔上查到,見結尾)
-
長度:指存儲的字節數(對於漢字,ZHS16GBK編碼一個漢字需要2個字節,UTF8需要3個字節。)
-
符號/指數位
1)具體的存儲值;
2)返回的數值就是Oracle在自己內部對expr值的存儲形式;
3)對於非漢字的普通字符串,可以理解爲就是它的ASCII碼。SYS@ tsid > select dump('a=?5') from dual; DUMP('A=?5') ------------------------- Typ=96 Len=4: 97,61,63,53 SYS@ tsid > select chr(97),chr(61),chr(63),chr(53) from dual; C C C C - - - - a = ? 5 SYS@ tsid > select ascii('a'),ascii('='),ascii('?'),ascii('5') from dual; ASCII('A') ASCII('=') ASCII('?') ASCII('5') ---------- ---------- ---------- ---------- 97 61 63 53
在存儲上,Oracle對正數和負數分別進行存儲轉換:
1)正數:指數=符號/指數位 - 193 (第一字節);加1存儲(爲了避免Null),在實際算法中就是要減1,必須>128
SQL> select dump(1) from dual; DUMP(1) ------------------------------------ Typ=2 Len=2: 193,2
2)負數:指數=62 - 第一字節;被101減,如果總長度小於21個字節,最後加一個102(是爲了排序的需要),必須<128
SQL> select dump(-1) from dual; DUMP(-1) ---------------------------------------------- Typ=2 Len=3: 62,100,102
-
從<數字1>開始是有效的數據位
-
從<數字1>開始是最高有效位,所存儲的數值計算方法爲:
將下面計算的結果加起來:
每個<數字位>乘以100^(指數-N) (N是有效位數的順序位,第一個有效位的N=0)
SQL> select dump(123456.789) from dual;
DUMP(123456.789)
-------------------------------
Typ=2 Len=6: 195,13,35,57,79,91
<指數>: 195 - 193 = 2
<數字1> 13 - 1 = 12 *100^(2-0) 120000
<數字2> 35 - 1 = 34 *100^(2-1) 3400
<數字3> 57 - 1 = 56 *100^(2-2) 56
<數字4> 79 - 1 = 78 *100^(2-3) .78
<數字5> 91 - 1 = 90 *100^(2-4) .009
123456.789
SQL> select dump(-123456.789) from dual;
DUMP(-123456.789)
----------------------------------
Typ=2 Len=7: 60,89,67,45,23,11,102
<指數> 62 - 60 = 2(最高位是0,代表爲負數)
<數字1> 101 - 89 = 12 *100^(2-0) 120000
<數字2> 101 - 67 = 34 *100^(2-1) 3400
<數字3> 101 - 45 = 56 *100^(2-2) 56
<數字4> 101 - 23 = 78 *100^(2-3) .78
<數字5> 101 - 11 = 90 *100^(2-4) .009
123456.789(-)
補充關於 Typ=2 Len=2: c1,11
中關於c1的理解:
參考《Oracle基本數據類型存儲格式淺析(二)——數字類型》
關於type類型的彙總
CODE TYP
----- ------------------------------
1 VARCHAR2
2 NUMBER
8 LONG
12 DATE
23 RAW
24 LONG RAW
69 ROWID
96 CHAR
112 CLOB
113 BLOB
114 BFILE
180 TIMESTAMP
181 TIMESTAMP WITH TIMEZONE
182 INTERVAL YEAR TO MONTH
183 INTERVAL DAY TO SECOND
208 UROWID
231 TIMESTAMP WITH LOCAL TIMEZONE