數值在Oracle的內部儲存

lhrbest發表於2017-07-11

數值在Oracle的內部儲存



作者:dbtan |【轉載時請以超連結形式標明文章出處作者資訊】






數值在Oracle的內部儲存:

Oracle在資料庫內部通過相應的演算法轉換來進行資料儲存,這裡簡單介紹Oracle的Number型數值儲存及轉換。可以通過DUMP函式來轉換數字的儲存形式,一個簡單的輸出類似如下格式:

sys@NEI> select dump(1),dump(1,16) from dual;
DUMP(1)            DUMP(1,16)
------------------ -----------------
Typ=2 Len=2: 193,2 Typ=2 Len=2: c1,2

DUMP函式的輸出格式類似:

型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,……,數字20]

其中各引數的含義如下:

·型別指欄位資料型別,Number型,Type=2(型別程式碼可以從Oracle的文件上查到);
·長度指儲存的位元組數;
·符號/指數位用於代表數字的正負及指數值;
·資料儲存。

在儲存上,Oracle對正數和負數分別進行儲存轉換。而0既不屬於正數,也不屬於負數,是單獨進行處理的。

sys@NEI> select dump(0),dump(0,16) from dual;
DUMP(0)          DUMP(0,16)
---------------- ---------------
Typ=2 Len=1: 128 Typ=2 Len=1: 80

在以上的輸出中,0以十六進位制0x80儲存,僅包含了符號位,未包含資料位。為什麼用0x80儲存呢?注意0x80其二進位制表示為1000 0000,2Bytes如果同時用來表示正數和負數,那麼0x80正好將編碼進行了等分,所以0x80用來表示0數值。

有了0值劃分之後,符號位大於80的就是正數,符號位小於80的就是負數。接下來看看數值的儲存,以下是數值1的儲存輸出:

sys@NEI> select dump(1),dump(1,16) from dual;
DUMP(1)            DUMP(1,16)
------------------ -----------------
Typ=2 Len=2: 193,2 Typ=2 Len=2: c1,2

數值1的符號位為193,表示這是一個正數,而1使用的是數值2來儲存。這是因為在C語言中0作為字串終結符被保留,所以數值1使用2儲存,進一步地,所有的正數都是通過“加1”進行儲存表示的。

簡單地說,正數以及負數安裝如下規則儲存。

·正數:加1儲存。
·負數:被101減。

接下來再來看看指數位的作用,根據科學計數法可以知道,任何一個實數S都可以描述為A.B×10^n的形式(A表示整數部分,B表示小數部分,而n表示10的指數部分)。當S大於1時,N大於等於0,S小於1時,N小於0。

儲存中的指數位可以通過如下方式換算出來。

·正數:指數=符號/指數位-193(0xC1)
·負數:指數=62(0x3E)- 第一位元組

去除指數位,實際上從<數字 1>開始才是有效的資料位,根據指數及第一位的數值就可以將儲存的數值還原出來,所以Oracle儲存的計算方法為:

∑<資料位n>×100^(指數-N)
注意這裡N是有效位數的順序位,第一個有效位的N=0。

來看一下以下的示例說明:

sys@NEI> 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

sys@NEI> select dump(-123456.789) from dual;
DUMP(-123456.789)
----------------------------------
Typ=2 Len=7: 60,89,67,45,23,11,102
<指數位>=62 - 60 = 2
<數字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,也就是十六進位制的0x66作為標記,這可以被看作符號位,表示負數,同時也是為了排序的需要,-123456.789在資料庫中實際儲存為60,89,67,45,23,11,而-123456.78901在資料庫中實際儲存為60,89,67,45,23,11,91,可見,如果不在最後加上102,在排序時會出現 -123456.789 < -123456.78901的情況。由於正數的表示範圍是0x01~0x64,負數的表示範圍是0x65~0x02。因此,不會在表示數字時出現0x66的。

- The End -






About Me

...............................................................................................................................

● 本文轉載自網路

● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-07-01 09:00 ~ 2017-07-31 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

數值在Oracle的內部儲存
DBA筆試面試講解
歡迎與我聯絡

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2141917/,如需轉載,請註明出處,否則將追究法律責任。

相關文章