Heim >Datenbank >MySQL-Tutorial >Oracle中number数据类型所占用的字节数

Oracle中number数据类型所占用的字节数

WBOY
WBOYOriginal
2016-06-07 17:19:481528Durchsuche

Oracle用变长的方式存储存储number数据,每个number值是以科学计数法的形式存储在数据库中的:一个字节用来存储符号/指数,多达2

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个字节。

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:MySQL的alter语句用法Nächster Artikel:ORA-00907: 缺少右括号