Oracle中number資料類型所佔用的位元組數

來源:互聯網
上載者:User

Oracle用變長的方式儲存儲存number資料,每個number值是以科學計數法的形式儲存在資料庫中的:一個位元組用來儲存符號/指數,多達20個位元組來儲存尾數。然而儲存的number資料的最大精度為38位。

例如,412在資料庫中的儲存形式為4.12 X 10^2,用一個位元組來儲存指數2,用另外兩個位元組來儲存數字4,1,2,所以412在資料庫中共佔用3個位元組。

對於符號/指數部分,用第8位表示數值的符號,0表示負數,1表示正數。用剩餘的7位表示指數,但是在計算時,必須將指數的值扣除64後,才是真正的指數值。

例如,如果符號/指數部分的值為223 ,它的二進位表示為11011111。它的第8為為1,這表示數值為正數,為了決定指數值,去掉第8位,剩下的7位1011111的值為95,扣除64後,得到31,這是真正的指數值。\

如果符號/指數部分的值為100,它的二進位表示為01100100。它的第8為為0,這表示數值為負數,將01100100 取補,得到10011011,去掉第8位,剩下的7位0011011的值為27,扣除64後,得到-37,這是真正的指數值。

對於尾數部分,每個值表示的值是100進位,並且為了避免二進位的0,在尾數部分的每個位元組上都自動加1,所以每個尾數位元組表示的數值範圍為1-100,實際上,它們表示的真正的數值範圍為0-99。如果是一個負數,則尾數部分會以102結束。

觀察number儲存的最好的工具是dump函數,它可以將number在資料庫中的內部儲存值顯現給我們:

如果123456.789.的dump值為:

DUMP(C1)

------------------------------------------

Typ=2 Len=6: 195,13,35,57,79,91

這表示在資料庫內部用6個位元組表示123456.789。每個位元組如下

第1個位元組 = 195 --> 表示為二進位為11000011

表示數值為正數,指數的值為67-64=3

第2個位元組 = 13

因為表示尾數,減1後得到12。

第3個位元組= 35

因為表示尾數,減1後得到34

第4個位元組= 57

因為表示尾數,減1後得到56.

第5個位元組= 79

因為表示尾數,減1後得到78.

第6個位元組= 91

因為表示尾數,減1後得到90.

我們得到指數為3,尾數部分的數值是基於100的,所以表示的數值為:

12 x (100 e 2) + 34 x (100 e 1) + 56 x (100 e 0)  + 78 x (100 e -1) +

90 x (100 e -2) = 123456.789

如果 -123456.789.的dump值為:

DUMP(C1)

------------------------------------------

Typ=2 Len=7: 60,89,67,45,23,11,102

這表示在資料庫內部用6個位元組表示123456.789。每個位元組如下:

注意:該數值以102結束,表示該數值是一個負數。

第1個位元組= 60 -->表示為二進位為00111100

第8位為0,表示數值是一個負數。該值取反後為11000011,去掉第8位,表示67,扣除64後,得到3,該指數的真正值為3。

第2個位元組= 89

因為表示尾數,減1後得到88,因為為負數,所以真正的數值為100 – 88得12

第3個位元組= 67

因為表示尾數,減1後得到66,因為為負數,所以真正的數值為100 – 66得34

第4個位元組= 45

因為表示尾數,減1後得到44,因為為負數,所以真正的數值為100 – 44得56

第5個位元組= 23

因為表示尾數,減1後得到22,因為為負數,所以真正的數值為100 – 22得78

第6個位元組= 11

因為表示尾數,減1後得到10,因為為負數,所以真正的數值為100 – 10得90

第7個位元組= 102

這表示這是最後一個位元組

我們得到指數為3,尾數部分的數值是基於100的,所以表示的數值為:

12 x (100 e 2) + 34 x (100 e 1) + 56 x (100 e 0)  + 78 x (100 e -1) +

90 x (100 e -2) = 123456.789

因為這是一個負數,所以真正得數值為-123456.789

當然也可以根據公式來推算數值佔用得空間:

數值number(p,s)佔用得空間為:

length = floor [(p+1)/2] + 1

備忘:如果該數值為負數,需要再加一個位元組。

所以你的NUMBER(5,2)佔用的位元組數為:floor [(p+1)/2] + 1 = floor [(5+1)/2] + 1 = 3 + 1 = 4

所以如果NUMBER(5,2)表示整數,佔用4個位元組,如果表示負數,佔用5個位元組。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.