当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-05-07

    本文导语: Oracle用变长的方式存储存储number数据,每个number值是以科学计数法的形式存储在数据库中的:一个字节用来存储符号/指数,多达20个字节来存储尾数。然而存储的number数据的最大精度为38位。 例如,412在数据库中的存储形式为4.1...

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ORACLE数据库常用字段数据类型介绍
  • oracle中的空类型与c语言的空类型相匹配吗?
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段?
  • Oracle中查看某列数据类型
  • 测试添加Oracle中Blob数据类型对象
  • jsp文件上传smartupload到oracle数据库中没有longblob的数据类型如何处理的?
  • oracle中 VARCHAR2是什么数据类型
  • 请问保存文章内容的字段应用什么类型的(oracle),急!!!
  • oracle中怎么没有boolean类型的字段?应该用什么代替?
  • 如何向oracle库中字段类型是date的添加数据
  • 请问:ORACLE中的数据取出来后,需不需要进行一定的转换才能变为C语言的数据类型啊?
  • jsp中在oracle中查询日期类型时sql语句该怎么写啊?
  • 怎样将当前时间写到Oracle中date类型的字段中!!!!!!!!!!!!
  • 急!急!oracle 中 long 类型在 tomcat 中的问题
  • 不能把几百个以上的汉字插入oracle varchar2类型的问题!
  • Oracle里long类型
  • jsp显示oracle中varchar2类型字段 在线等待
  • Oracle中的Raw类型解释
  • 我要向oracle中插入大文本,用的是lang类型的字段,但是只能插3000字,再多就抱错,说我字符串过长。谁遇到过此问题?
  • Oracle返回表类型的自定义函数
  • Oracle中字符集的类型决定varchar2的字符长度
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,