oracle dump詳解
-
dump函式(number型別) 筆記
-
dump 函式能檢視錶中列在datafile儲存內容。
-
Oracle的NUMBER型別最多由三個部分構成,這三個部分分別是最高位表示位、資料部分、符號位。其中負數包含符號位,正數不會包括符號位(10進位制即102)。另外,數值0比較特殊,它只包含一個數值最高位表示位80(16進位制),沒有資料部分。
-
-
用法:DUMP(expr[,number_format[,start_position][,length]])
-
-
用法說明: dump(col_name,8|10|16|17) ,其中8|10|16|17 為number_format,分別為8進位制,10進位制(預設值),16進位制,單字元。
-
-
The syntax is:
-
DUMP(expr[,return_fmt[,start_position[,length]]])
-
The argument return_fmt specifies the format of the return value and can have any of the following values:
-
8 returns result in octal notation.
-
10 returns result in decimal notation.
-
16 returns result in hexadecimal notation.
-
17 returns result as single characters.
-
By default, the return value contains no character set information. To retrieve the character set name of expr, specify any of the preceding format values, plus 1000. For example, a return_fmt of 1008 returns the result in octal, plus provides the character set name of expr.
-
The arguments start_position and length combine to determine which portion of the internal representation to return. The default is to return the entire internal representation in decimal notation.
-
If expr is null, then this function returns a null.
-
-
-
DUMP函式的輸出格式類似:
-
-
型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
-
-
各位的含義如下:
-
-
1.型別: Number型,Type=2 (型別程式碼可以從Oracle的文件上查到,見結尾)
-
-
2.長度:指儲存的位元組數
-
-
3.符號/指數位
-
-
在儲存上,Oracle對正數和負數分別進行儲存轉換:
-
-
正數:加1儲存(為了避免Null),在實際演算法中就是要減1,必須>128
-
負數:被101減,如果總長度小於21個位元組,最後加一個102(是為了排序的需要),必須<128
-
-
指數位換算:
-
-
正數:指數=符號/指數位 - 193 (第一位元組)
-
負數:指數=62 - 第一位元組
-
-
4.從<數字1>開始是有效的資料位
-
-
從<數字1>開始是最高有效位,所儲存的數值計算方法為:
-
-
將下面計算的結果加起來:
-
-
每個<數字位>乘以100^(指數-N) (N是有效位數的順序位,第一個有效位的N=0)
-
-
===numbe型別例子====
-
例1:(區別正數和負數)
-
SQL> select dump(0) from dual;
-
-
DUMP(0)
-
--------------------------------
-
Typ=2 Len=1: 128
-
##
-
例1中可以看見,為什麼>128斷定為正數,而<128 斷定為負數(10進位制)
-
-
## 16進位制分析正數和負數
-
SQL> select dump(0,16) from dual;
-
-
DUMP(0,16)
-
------------------------------
-
Typ=2 Len=1: 80--------------------(只有高位)
-
-
1 row selected.
-
-
DUMP(0) 的結果是0x80,在前面已經提到,0只有高位表示位,沒有資料位。由於0的特殊,既不屬於正數,也不屬於負數,因此使用高位表示位用80表示就足夠了, 不會和其它資料衝突,Oracle出於節省空間的考慮將後面資料部分省掉了。但是為什麼Oracle選擇0x80表示0呢?我們知道正數和負數互為相反 數,每個正數都有一個對應的負數。因此如果我們要使用編碼表示數值,則表示正數和負數的編碼應該各佔一半,這樣才能保證使Oracle表示資料範圍是合理的。而0x80的二進位制編碼是1000 0000,正好是一個位元組編碼最大值的一半,因此,Oracle選擇0x80來表示0,是十分有道理的。
-
-
-
@@@@
-
-
例2:(正數)
-
SQL> select dump(1,10) from dual;
-
-
DUMP(1,10)
-
------------------------------------
-
Typ=2 Len=2: 193,2
-
| |
-
高位,資料部分
-
-
-
1 row selected.
-
-
##
-
SQL> select dump(1) from dual;
-
-
DUMP(1)
-
------------------------------------
-
Typ=2 Len=2: 193,2
-
-
1 row selected.
-
##
-
例2中可以看見dump(1,10)和dump(1) 輸出結果一樣:Typ=2 Len=2: 193,2
-
型別是number,2位元組,因為正數所以>128,因為正數所以儲存時候都+1
-
-
<指數>: 193 - 193 = 0
-
<數字1> 2 - 1 = 1 *100^(0-0)
-
= 1
-
-
@@@@@@@@
-
例3:(正數指數變化)
-
SQL> select dump(99) from dual;
-
-
DUMP(99)
-
----------------------------------------
-
Typ=2 Len=2: 193,100
-
-
1 row selected.
-
-
-
##
-
-
SQL> select dump(100) from dual;
-
-
DUMP(100)
-
------------------------------------
-
Typ=2 Len=2: 194,2
-
-
1 row selected.
-
-
例3對比就知道,第一位元組指數從193變化到194
-
-
@@@@@@@@@@@
-
-
例4:(負數)
-
SQL> select dump(-98) from dual;
-
-
DUMP(-98)
-
------------------------------------------
-
Typ=2 Len=3: 62,3,102
-
| | |
-
高位,資料部分,符號位
-
-
-
-
-
-
1 row selected.
-
<指數> 62 - 62 = 0
-
<數字1> 101 - 3 = 98 *100^(0-0)
-
= 98
-
-
##
-
SQL> select dump(-99) from dual;
-
-
DUMP(-99)
-
------------------------------------------
-
Typ=2 Len=3: 62,2,102
-
-
1 row selected.
-
-
<指數> 62 - 62 = 0
-
<數字1> 101 - 2 = 99 *100^(0-0)
-
= 99
-
-
-
-
-
###
-
SQL> select dump(-100) from dual;
-
-
DUMP(-100)
-
----------------------------------------------
-
Typ=2 Len=3: 61,100,102
-
-
1 row selected
-
-
最後加102是目的:
-
實際儲存中-98 為62,3
-
-99 為62,2
-
-100為61,100
-
-
得知-98>-99>-100
-
-
但是如果
-
SQL> select dump(-98.001) from dual;
-
-
DUMP(-98.001)
-
--------------------------------------------------------
-
Typ=2 Len=5: 62,3,101,91,102
-
-
1 row selected.
-
-
透過這個得知 沒有102:-98.001為 62,3,101,91 >-98 為62,3
-
-
有102:-98.001為 62,3,101,91,102
-
-98 為 62,3,102
-
-
-
所以加102目的是排序的需要!
-
-
-
例5:(數字位演算法)
-
SQL> select dump(7654321) from dual;
-
-
DUMP(7654321)
-
------------------------------------------------------
-
Typ=2 Len=5: 196,8,66,44,22
-
-
1 row selected.
-
-
<指數>: 196 - 193 = 3
-
<數字1> 8 - 1 = 7 *100^(3-0) 7000000
-
<數字2> 66 - 1 = 65 *100^(3-1) 650000
-
<數字3> 44 - 1 = 43 *100^(3-2) 4300
-
<數字4> 22 - 1 = 21 *100^(3-3) 21
-
-
##
-
SQL> select dump(87654321) from dual;
-
-
DUMP(87654321)
-
--------------------------------------------------------
-
Typ=2 Len=5: 196,88,66,44,22
-
-
1 row selected.
-
-
-
-
<指數>: 196 - 193 = 3
-
<數字1> 88 - 1 = 87 *100^(3-0) 87000000
-
<數字2> 66 - 1 = 65 *100^(3-1) 650000
-
<數字3> 44 - 1 = 43 *100^(3-2) 4300
-
<數字4> 22 - 1 = 21 *100^(3-3) 21
-
-
-
-
-
×××××××××××××××
-
型別程式碼(參考)
-
程式碼 資料型別 oracle 版本
-
1 varchar2 7
-
2 number 7
-
8 long 7
-
12 date 7
-
23 raw 7
-
24 long raw 7
-
69 rowid 7
-
96 char 7
-
112 clob 8
-
113 blob 8
-
114 bfile 8
-
180 timestamp 9i
-
181 timestamp with timezone 9i
-
182 interval year to month 9i
-
183 interval day to second 9i
-
208 urowid 8i
-
231 timestamp with local timezone 9i
-
-
-
****************************************************************
-
****************************************************************
-
Oracle在資料庫內部透過相應的演算法轉換來進行資料儲存,本文簡單介紹Oracle的Number型數值儲存及轉換.
-
我們可以透過DUMP函式來轉換數字的儲存形式,一個簡單的輸出類似如下格式:
-
SQL> select dump(1) from dual;
-
DUMP(1)
-
------------------
-
Typ=2 Len=2: 193,2
-
DUMP函式的輸出格式類似:
-
型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
-
各位的含義如下:
-
1.型別: Number型,Type=2 (型別程式碼可以從Oracle的文件上查到)
-
2.長度:指儲存的位元組數
-
3.符號/指數位
-
在儲存上,Oracle對正數和負數分別進行儲存轉換:
-
正數:加1儲存(為了避免Null)
-
負數:被101減,如果總長度小於21個位元組,最後加一個102(是為了排序的需要)
-
指數位換算:
-
正數:指數=符號/指數位 - 193 (最高位為1是代表正數)
-
負數:指數=62 - 第一位元組
-
4.從<數字1>開始是有效的資料位
-
從<數字1>開始是最高有效位,所儲存的數值計算方法為:
-
將下面計算的結果加起來:
-
每個<數字位>乘以100^(指數-N) (N是有效位數的順序位,第一個有效位的N=0)
-
5. 舉例說明
-
-
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(-)
-
現在再考慮一下為什麼在最後加102是為了排序的需要,-123456.789在資料庫中實際儲存為
-
60,89,67,45,23,11
-
而-123456.78901在資料庫中實際儲存為
-
60,89,67,45,23,11,91
-
可見,如果不在最後加上102,在排序時會出現-123456.789<-123456.78901的情況。
-
NUMBER數字型別為什麼有2個位元組的長度呢?
-
對於這個問題,我想我們應該知道,所有資料型別最終在計算機裡都以二進位制儲存,實際上所謂的資料型別都是我們定義的.所以儲存只由演算法決定.
-
所以這個問題是不成立的.比如:
-
-
SQL> select dump(110) from dual;
-
DUMP(110)
-
---------------------
-
Typ=2 Len=3: 194,2,11
-
SQL> select dump(1100) from dual;
-
DUMP(1100)
-
-------------------
-
Typ=2 Len=2: 194,12
-
- 我們會看到,雖然1100>110,但是儲存上1100卻只佔2位元組,而110卻佔了3個位元組.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28878983/viewspace-2137517/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle資料塊dump檔案中ITL詳解Oracle
- oracle dump blockOracleBloC
- ORACLE BLOCK DUMPOracleBloC
- ORACLE dump kshOracle
- oracle dump 命令Oracle
- oracle dump 函式Oracle函式
- oracle dump commandOracle
- Oracle dump函式Oracle函式
- Oracle常用dump命令Oracle
- dump oracle events(轉)Oracle
- Oracle 常用dump命令Oracle
- In Oracle,How to use dumpOracle
- php中var_dump()函式的詳解說明PHP函式
- Oracle的dump函式Oracle函式
- 轉:Oracle常用dump命令Oracle
- Oracle 常用dump命令 - 轉Oracle
- Oracle常用dump命令(轉)Oracle
- ZT:Oracle常用dump命令Oracle
- 【備查】oracle dump命令Oracle
- Oracle Dump Redo Log FileOracle
- Python中dumps, loads dump, load用法詳解Python
- oracle之 Oracle LOB 詳解Oracle
- oracle INVENTORY 詳解Oracle
- oracle recyclebin詳解Oracle
- ORACLE -詳解SCNOracle
- Oracle SCN詳解Oracle
- Oracle checkpoint詳解Oracle
- Oracle Hints詳解Oracle
- oracle 序列 詳解Oracle
- oracle statspack詳解Oracle
- Oracle ASM 詳解OracleASM
- oracle 序列詳解Oracle
- oracle statspack 詳解Oracle
- Oracle bootstrap$ 詳解Oracleboot
- Oracle PGA詳解Oracle
- oracle Dataguard 詳解Oracle
- Oracle Hint 詳解Oracle
- 詳解JAVA執行緒問題診斷工具Thread DumpJava執行緒thread