数值在Oracle的内部存储
数值在Oracle的内部存储:
Oracle在数据库内部通过相应的算法转换来进行数据存储,这里简单介绍Oracle的Number型数值存储及转换。可以通过DUMP函数来转换数字的存储形式,一个简单的输出类似如下格式:
DUMP函数的输出格式类似:
其中各参数的含义如下:
在存储上,Oracle对正数和负数分别进行存储转换。而0既不属于正数,也不属于负数,是单独进行处理的。
在以上的输出中,0以十六进制0x80存储,仅包含了符号位,未包含数据位。为什么用0x80存储呢?注意0x80其二进制表示为1000 0000,2Bytes如果同时用来表示正数和负数,那么0x80正好将编码进行了等分,所以0x80用来表示0数值。
有了0值划分之后,符号位大于80的就是正数,符号位小于80的就是负数。接下来看看数值的存储,以下是数值1的存储输出:
数值1的符号位为193,表示这是一个正数,而1使用的是数值2来存储。这是因为在C语言中0作为字符串终结符被保留,所以数值1使用2存储,进一步地,所有的正数都是通过“加1”进行存储表示的。
简单地说,正数以及负数安装如下规则存储。
接下来再来看看指数位的作用,根据科学计数法可以知道,任何一个实数S都可以描述为A.B×10^n的形式(A表示整数部分,B表示小数部分,而n表示10的指数部分)。当S大于1时,N大于等于0,S小于1时,N小于0。
存储中的指数位可以通过如下方式换算出来。
去除指数位,实际上从<数字 1>开始才是有效的数据位,根据指数及第一位的数值就可以将存储的数值还原出来,所以Oracle存储的计算方法为:
来看一下以下的示例说明:
注意在负数末尾会加入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群,学习最实用的数据库技术。