加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2007-11-03 09:07:12)
 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个字节。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有