数值在Oracle的内部存储

简介: 数值在Oracle的内部存储 作者:dbtan |【转载时请以超链接形式标明文章出处和作者信息】 链接:http://www.

数值在Oracle的内部存储



作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】






数值在Oracle的内部存储:

Oracle在数据库内部通过相应的算法转换来进行数据存储,这里简单介绍Oracle的Number型数值存储及转换。可以通过DUMP函数来转换数字的存储形式,一个简单的输出类似如下格式:

sys@NEI> select dump(1),dump(1,16) from dual;
DUMP(1)            DUMP(1,16)
------------------ -----------------
Typ=2 Len=2: 193,2 Typ=2 Len=2: c1,2

DUMP函数的输出格式类似:

类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,……,数字20]

其中各参数的含义如下:

·类型指字段数据类型,Number型,Type=2(类型代码可以从Oracle的文档上查到);
·长度指存储的字节数;
·符号/指数位用于代表数字的正负及指数值;
·数据存储。

在存储上,Oracle对正数和负数分别进行存储转换。而0既不属于正数,也不属于负数,是单独进行处理的。

sys@NEI> select dump(0),dump(0,16) from dual;
DUMP(0)          DUMP(0,16)
---------------- ---------------
Typ=2 Len=1: 128 Typ=2 Len=1: 80

在以上的输出中,0以十六进制0x80存储,仅包含了符号位,未包含数据位。为什么用0x80存储呢?注意0x80其二进制表示为1000 0000,2Bytes如果同时用来表示正数和负数,那么0x80正好将编码进行了等分,所以0x80用来表示0数值。

有了0值划分之后,符号位大于80的就是正数,符号位小于80的就是负数。接下来看看数值的存储,以下是数值1的存储输出:

sys@NEI> select dump(1),dump(1,16) from dual;
DUMP(1)            DUMP(1,16)
------------------ -----------------
Typ=2 Len=2: 193,2 Typ=2 Len=2: c1,2

数值1的符号位为193,表示这是一个正数,而1使用的是数值2来存储。这是因为在C语言中0作为字符串终结符被保留,所以数值1使用2存储,进一步地,所有的正数都是通过“加1”进行存储表示的。

简单地说,正数以及负数安装如下规则存储。

·正数:加1存储。
·负数:被101减。

接下来再来看看指数位的作用,根据科学计数法可以知道,任何一个实数S都可以描述为A.B×10^n的形式(A表示整数部分,B表示小数部分,而n表示10的指数部分)。当S大于1时,N大于等于0,S小于1时,N小于0。

存储中的指数位可以通过如下方式换算出来。

·正数:指数=符号/指数位-193(0xC1)
·负数:指数=62(0x3E)- 第一字节

去除指数位,实际上从<数字 1>开始才是有效的数据位,根据指数及第一位的数值就可以将存储的数值还原出来,所以Oracle存储的计算方法为:

∑<数据位n>×100^(指数-N)
注意这里N是有效位数的顺序位,第一个有效位的N=0。

来看一下以下的示例说明:

sys@NEI> select dump(123456.789) from dual;
DUMP(123456.789)
-------------------------------
Typ=2 Len=6: 195,13,35,57,79,91

<指数位>=195 - 193 = 2
<数字1>=13 - 1 = 12 *100^(2-0) = 120000
<数字2>=35 - 1 = 34 *100^(2-1) = 3400
<数字3>=57 - 1 = 56 *100^(2-2) = 56
<数字4>=79 - 1 = 78 *100^(2-3) = .78
<数字5>=91 - 1 = 90 *100^(2-4) = .009
    ∑ = 123456.789

sys@NEI> select dump(-123456.789) from dual;
DUMP(-123456.789)
----------------------------------
Typ=2 Len=7: 60,89,67,45,23,11,102
<指数位>=62 - 60 = 2
<数字1>=101 - 89 = 12 *100^(2-0) = 120000
<数字2>=101 - 67 = 34 *100^(2-1) = 3400
<数字3>=101 - 45 = 56 *100^(2-2) = 56
<数字4>=101 - 23 = 78 *100^(2-3) = .78
<数字5>=101 - 11 = 90 *100^(2-4) = .009
    ∑ = 123456.789(-)

注意在负数末尾会加入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群,学习最实用的数据库技术。


DBA笔试面试讲解
欢迎与我联系

目录
相关文章
|
6月前
|
SQL 存储 Oracle
Oracle之如何生成出连续的数值
Oracle之如何生成出连续的数值
208 1
|
存储 Oracle 关系型数据库
Oracle的存储结构
Oracle的存储结构
129 1
|
15天前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的物理存储结构
Oracle的物理存储结构包括数据文件、联机重做日志文件、控制文件、归档日志文件、参数文件、告警日志文件、跟踪文件和备份文件。这些文件在硬盘上存储数据库的各种数据和日志信息,确保数据库的正常运行和故障恢复。视频讲解和详细说明见原文。
|
6月前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
6月前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
113 7
|
6月前
|
缓存 Oracle 关系型数据库
Oracle查询优化-生成连续数值
【2月更文挑战第2天】【2月更文挑战第5篇】nextval是Oracle数据库中用于自增长序列的函数。序列是一个自增长数字的对象,可以用于关系型数据库中的任何表的列中,以保证每条记录拥有唯一标识。
145 4
|
Oracle 关系型数据库
Oracle常用数值型函数
Oracle常用数值型函数
|
存储 Oracle 关系型数据库
oracle数据库 修改表空间数据文件大小,优化存储
oracle数据库 修改表空间数据文件大小,优化存储
|
存储 Oracle 关系型数据库
oracle学习53-plsql轻量版存储过程和存储函数
oracle学习53-plsql轻量版存储过程和存储函数
94 0
oracle学习53-plsql轻量版存储过程和存储函数
|
存储 Oracle 关系型数据库
❤️Oracle 存储结构,图文并茂,超详细❤️
❤️Oracle 存储结构,图文并茂,超详细❤️
193 0
❤️Oracle 存储结构,图文并茂,超详细❤️