当前位置:  数据库>oracle

DUMP函数--Oracle是如何在内部存储NUMBER类型的数据?

    来源: 互联网  发布时间:2017-03-28

    本文导语: Oracle在数据库内部通过相应的算法转换来进行数据存储,本文旨在介绍NUMBER类型的值是如何被存储的。 先看一个简单的示例: SQL> select dump(1) from dual;DUMP(1)------------------Typ=2 Len=2: 193,2 dump函数的输出格式为: 类型  :  符号/指数...

Oracle在数据库内部通过相应的算法转换来进行数据存储,本文旨在介绍NUMBER类型的值是如何被存储的。

先看一个简单的示例:

SQL> select dump(1) from dual;
DUMP(1)
------------------
Typ=2 Len=2: 193,2


dump函数的输出格式为:

类型  :  符号/指数位  [数字1,数字2,数字3,. . . ,数字20]

各项含义如下:

1、类型:Type=2表示NUMBER类型,不同类型对应不同的代码。

2、长度:存储的字节数。

3、符号/指数位:根据正数或负数,Oracle存储转换的算法有别,见下:

在存储上,Oracle对正数和负数分别进行存储转换:

正数:加 1 存储(为了避免NULL)。
负数:被 101 减,如果总长度小于21个字节,最后加一个102(是为了排序的需要)

指数位换算:

正数:指数=符号/指数位 - 193(最高位为1代表正数)
负数:指数=62 - 第一字节                                                       -->此第一字节,没理解,难道是值符号/指数位?

4、从[数字1...]开始是有效的数据位

从[数字1]开始是最高有效位,所存储的数值计算方法为:

每个乘以 100^(指数-N)(N是有效位数的顺序位,第一个有效位的N=0)

举例:

SQL> 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] = 0.78
数字5:91 - 1 = 90 * 100^[2 - 4] = 0.009




120000 + 3400 + 56 + 0.78 + 0.009 = 123456.789(+)

SQL> 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] = 0.78
数字5:101 - 11 = 90 * 100[2 - 4] = 0.009




120000 + 3400 + 56 + 0.78 + 0.009 = 123456.789(-)

我们发现多于的一个102没有被计算,Oracle是为了排序的需要,-123456.789在数据库中实际存储为:60,89,67,45,23,11。

而-123456.78901在数据库中实际存储为60,89,67,45,23,11,91。可见,-123456.789在数据库内部的存储值如果不加102,在排序上会出现-123456.78901 > -123456.789的情形。





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












  • 相关文章推荐
  • java命名空间javax.swing.text类abstractdocument的类成员方法: dump定义及介绍
  • 关于core dump
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 我的Ubuntu没有dump/restore命令,需要安装什么呢
  • .net/c#/asp.net iis7站长之家
  • linux下如何为正在运行的程序创建core dump?
  • 进程异常退出时 Unix 在什么情况下会不产生 core dump 文件?
  • 【求教】符号表是干什么用的?怎么用?core dump出来以后怎么看?
  • 奇怪的core dump
  • 求救:高手请进: 使用 qsort()涵数时 core dump 阿?
  • 出现core dump,但是bt没有发现有价值的信息时
  • AIX中出现的Segmentation fault(code dump)如何解决?
  • core dump问题
  • 求解:父进程如何知道子进程core dump?
  • UNIX线程共用一个变量,出现core dump
  • linux下经常随机core dump有时几天死一次,有时一天死几次
  • segmentation fault(core dump)这句话怎么解释??
  • core dump? 如何定位
  • 怎么使用core dump
  • core dump 文件生成 在内核中的实现是怎么样的?
  • linux运行错误的为什么不core dump,是不是有什么环境设置


  • 站内导航:


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

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3