前导发端:yangtingkun.itpub.net


这篇文章重要描述NUMBER标准的数据和若安在数据库中存储的。

Oracle的NUMBER标准最多由三个部门构成,这三个部门分袂是最高位表示位、数据部门、标识表记标帜位。个中正数包罗标识表记标帜位,正数不会包罗标识表记标帜位。其它,数值0比拟特别,它只包罗一个数值最高位表示位80,没无数据部门。

正数的最高位表示位年夜于80,正数的最高位表示位小于80。个中一个正数的最高位是个位的话,则最高位表示位为C1,百位、万位依次为C2、C3,百分位、万分为依次为C0、BF。一个正数的最高位为个位的话,最高位表示位为3E,百位、万位依次为3D、3C,百分位、万分位依次为3F、40。

数据部门每一位都表示2位数。这个两位数能够是从0到99,如果是数据本身是正数,则分袂用二进制的1到64表示,如果数据本身是正数,则应用二进制65到2表示。

标识表记标帜位用66表示。

下面的这些是我经由DUMP成果总结出来的,关于下面提到的这些相关常数,Oracle之以是如许选择是有道理的,我们反面凭证例子也可以推导出来,而且会进一步理会');为什么会采用这种体模样外形式表示。这里列出的意思是使年夜家先对NUMBER标准数占据一个也许的熟悉。

下面我们经由一个例子细致理会');:

SQL> CREATE TABLE TEST_NUMBER (NUMBER_COL NUMBER);

表已创建。

SQL> INSERT INTO TEST_NUMBER VALUES (0);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (1);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (2);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (25);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (123);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (4100);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (132004078);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (2.01);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (0.3);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (0.00000125);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (115.200003);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (-1);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (-5);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (-20032);

已创建 1 行。

SQL> INSERT INTO TEST_NUMBER VALUES (-234.432);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> COL D_NUMBER FORMAT A50
SQL> SELECT NUMBER_COL, DUMP(NUMBER_COL, 16) D_NUMBER FROM TEST_NUMBER;

NUMBER_COL D_NUMBER
---------- --------------------------------------------------
         0 Typ=2 Len=1: 80
         1 Typ=2 Len=2: c1,2
         2 Typ=2 Len=2: c1,3
        25 Typ=2 Len=2: c1,1a
       123 Typ=2 Len=3: c2,2,18
      4100 Typ=2 Len=2: c2,2a
 132004078 Typ=2 Len=6: c5,2,21,1,29,4f
      2.01 Typ=2 Len=3: c1,3,2
        .3 Typ=2 Len=2: c0,1f
 .00000125 Typ=2 Len=3: be,2,1a
115.200003 Typ=2 Len=6: c2,2,10,15,1,4
        -1 Typ=2 Len=3: 3e,64,66
        -5 Typ=2 Len=3: 3e,60,66
    -20032 Typ=2 Len=5: 3c,63,65,45,66
  -234.432 Typ=2 Len=6: 3d,63,43,3a,51,66

已选择15行。

下面凭证例子获得的成果,对每行进行理会');。起首理会');两点基本的。DUMP函数前去的TYPE=2表示DUMP的数据标准是NUMBER,LENGTH=N表示数值在数据库中存储的长度是N。

1.DUMP(0)的成果是0x80,在后面曾经提到,0只需高位表示位,没无数据位。因为0的特别,既不属于正数,也不属于正数,因此应用高位表示位用80表示就充裕了,不会和其它数据抵触,Oracle出于糜掷空间的考虑将反面数据部门省失了。可是为什么Oracle选择0x80表示0呢?我们晓得正数和正数互为相反数,每个正数都有一个对应的正数。因此如果我们要应用编码表示数值,则暗匡正数和正数的编码应该各占一半,如许才气保证使Oracle表示数据范围是合理的。而0x80的二进制编码是1000 0000,恰好是一个字节编码最年夜值的一半,因此,Oracle选择0x80来表示0,是十分有道理的。

2.DUMP(1)的成果是0xc102,0xc1表示了最高位个位,0x2表示数值是1。起首,Oracle为什么用C1表示个位呢?实在,道理和刚才的差不多。采用迷信计数法,任何一个实数S都可以描述为A.B×10n,A表示整数部门,B表示小数部门,而N表示10的指数部门。当S年夜于1时,N年夜于便是0,S小于1时,N小于0。也便是说,采用指数的体模样外形式表示,N年夜于0和N小于0的环境各占一半支配时,Oracle所表示的范围最广。因此,Oracle选择了C1表示个位是最高位的环境。

SQL> SELECT TO_CHAR(ROUND(TO_NUMBER('81', 'XXX') (TO_NUMBER('FF', 'XXX') - TO_NUMBER('81', 'XXX') 1)/2), 'XX') FROM DUAL;

TO_
---
 C1

为什么ORACLE应用0x2表示1,而不直接应用0x1表示1呢?Oracle每个字节表示2位数,因此关于这个2位数,出现的能够是0~99共100种能够,标题出在0这里。Oracle底层是用C语言完成的,我们晓得二进制0在C语言顶用作字符串闭幕符,Oracle为了避免这个标题,因此应用了0x1表示0,并依次类推,应用0x64表示99。

3.DUMP(2)的成果是0xc103。

4.DUMP(25)的成果是0xc11a。后面提到,数据部门是以2位为最小单位保管的。因此关于25来说,最高位表示位依然是个位,个位上的值是25,凭证下面推出的法则正直,25在存储为0xc11a。

SQL> SELECT TO_CHAR(25 1, 'xx') FROM DUAL;

TO_
---
 1a

5.DUMP(123)的成果是0xc20218。因为123最高为是百位,以是最高位表示位为0xc2,百位上是1,用0x02表示,个位上是23,用0x18表示。

6.DUMP(4100)的成果是0xc22a。

仔细一点,如果数字最初数位上如果是0,Oracle出于糜掷空间的考虑不会存储。好比:4100只保管百位上的41,12000000只保管百位位上的12,512000只保管万位上的51和百位上的20。

7.DUMP(132004078)的成果是0xc5022101294f。最高位是亿位,因此用0xC5表示,亿位上是1用0x02表示,百位位上是32用0x21表示,万位上是0用0x01表示,百位上是40用0x29表示,个位上78用0x4F表示。

仔细:中间数位上的0不能省略。

8.DUMP(2.01)的成果是0xc10302。最高位是个位用0xC1表示,个位上是2用0x03表示,百分位上是1用0x02表示。

仔细:个位下面一位是百分位不是十分位。

9.DUMP(0.3)的成果是0xc01f。最高位是百分位,应用0xC0表示,百分位上是30用0x1F表示。

10.DUMP(0.00000125)的成果是0xbe021a。最高位是百万分位,用0xBE表示,最高位上的1用0x02表示,25用0x1a表示。

11.DUMP(115.200003)的成果是0xc20210150104。

12.DUMP(-1)的成果是0x3e6466。最高位个位,用0x3E表示,64表示个位上是1,66是标识表记标帜位,表示这个数是正数。

正数和正数互为相反数,正数的最高位表示位和它对应的相反数的最高位相加的值是FF。1的最高位表示位是C1,-1的最高位表示位是3E。正数中1用64表示。正数中的数值和它相反数的数据相加是0x66,也便是标识表记标帜位。正数1用0x02表示,正数1用0x64表示,二者相加是0x66。正数多个一个标识位,用0x66表示。因为正数的表示范围是0x01到0x64,正数的表示范围是0x65到0x02。因此,不会在表示数字时出现的0x66表示。

13.DUMP(-5)的成果是0x3e6066。0x3e表示最高位是个位,0x60表示个位上是5,0x66是标识表记标帜标识位。0x3E加0xC1是0xFF。0x60加0x06的成果是0x66。

14.DUMP(-20032)的成果是0x3c63654566。最高位是万位,正数的万位是0xC3,因此正数的万位是0x3C。万位上是2,正数用0x03表示,正数为0x63,百位上是0,正数用0x01表示,正数应用0x65表示,个位上是32,正数用0x21表示,正数应用0x45表示。0x66是正数表示位。

15.DUMP(-234.432)的成果是0x3d63433a5166。

凭证Oracle的存储特征,还可以推出Oracle的number标准的取值范围。

Oracle的concept上是如许描述的:

The following numbers can be stored in a NUMBER column:

Positive numbers in the range 1 x 10-130 to 9.99...9 x 10125 with up to 38 significant digits.

Negative numbers from -1 x 10-130 to 9.99...99 x 10125 with up to 38 significant digits.

Zero.

下面来推导出取值范围。

来看标识表记标帜位,0xC1表示个位。

SQL> select to_number('ff', 'xxx') - to_number('c1', 'xxx') from dual;

TO_NUMBER('FF','XXX')-TO_NUMBER('C1','XXX')
-------------------------------------------
                                         62

因为Oracle是两位、两位存储的,因此最高位相当于62×2=124,而且最高位上最年夜值是99,因此正数的最年夜值为9.999……×10125

SQL> select to_number('c1', 'xxx') - to_number('80', 'xxx') from dual;

TO_NUMBER('C1','XXX')-TO_NUMBER('80','XXX')
-------------------------------------------
                                         65

最高位相当于65×2=130,因此正数的最小值为1×10-130

正数和正数在各应用了一半的编码,因此具有相反的极值范围。

版权声明: 原创作品,承诺转载,转载时请务必以超链接形式标明文章 原始理由 、作者信息和本声明。不然将穷究规律责任。

转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/07/1976098.html

Oracle基本数据标准存储样式浅析(二)——数字标准相关推荐

  1. Oracle根底数据标准存储名目浅析(三)——日期标准(三)

    来历:yangtingkun.itpub.net 倘若间接在SQL语句中对SYSDATE或由TO_DATE函数生成日期进行DUMP操纵,会创造掉掉的成绩与DUMP数据库中保管的日期的成绩不一样. SQ ...

  2. oracle存储一个数字格式,Oracle根本数据类型存储格式研究(二)—数字类型

    Oracle基本数据类型存储格式研究(二)-数字类型 数字类型包含number,integer,float...oracle内部标识为2 数字类型在oracle内部是以单字节的数字为存储的变长数组 数 ...

  3. Oracle数据类型及存储方式——字符类型篇

    注:这篇文章绝大部分都摘抄于袁光东先生的  <<oracle小组学习笔记>>. 下面会对各种字符类型作详细解释. 一. char 类型 oracle 可以定义1个char(n) ...

  4. python的四种内置数字类型_浅析Python数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

  5. Oracle 数据类型及存储方式

    Oracle 数据类型及存储方式  袁光东 原创  概述  通过实例,全面而深入的分析oralce的基本数据类型及它们的存储方式.以ORACLE 10G为基础,介绍oralce 10g引入的新的数据类 ...

  6. Oracle 数据类型及存储方式(袁光东 原创)

    概述 通过实例,全面而深入的分析oralce 10G的基本数据类型及它们的存储方式.从实用和优化的角度出发,讨论每种数据类型的特点.从这里开始oracle之旅! 第一部份 字符类型 §1.1 char ...

  7. oracle实验报告2:: Oracle数据库物理存储结构管理(含实验小结)

    目录 实验目的 实验设备及器材 实验内容 实验步骤 实验过程 实验小结 实验目的 1.熟悉Oracle数据库物理存储结构: 2.掌握Oracle数据库数据文件的管理: 3.掌握Oracle数据库控制文 ...

  8. Oracle 19c rac 存储迁移

    Oracle 19c rac 存储迁移 一.概述 二.openfiler添加新存储硬盘 三.操作系统挂载共享存储 四.配置udev 五.确认磁盘可用性 六.备份ocr和votedisk 七.迁移ocr ...

  9. MySQL Memory 存储引擎浅析

    MySQL Memory 存储引擎浅析 吴剑 2011-11-29 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 吴剑 http://www.cnblog ...

最新文章

  1. findcontours 崩溃
  2. getbean方法找不到bean_和平精英:一直找不到敌人?5个方法,让你彻底摆脱“瞎子”...
  3. Python--进程、线程、协程对比
  4. keras库的安装及使用,以全连接层和手写数字识别MNIST为例
  5. 大数据有哪些基本特征
  6. 基于SSM的商旅系统
  7. 大学计算机基础vfp程序设计课程试验报告簿,vfp实验报告2014.doc
  8. 基于CANape开发的XCP测量
  9. 网页与多个服务器建立websoc,同一个页面怎么发起多个websocket
  10. 十大经典算法及其优化
  11. DAC0832的多功能信号/波形发生器Proteus仿真设计,4种波形(正弦、三角、方波、锯齿),附仿真+C程序+论文等
  12. 【解决】联想拯救者/MT7921网卡 ubuntu里 wifi/蓝牙 无法识别连接
  13. Vivado工程清除中间文件
  14. 解决vs2008安装问题 Office 2007 Microsoft Visual Studio Web 创作组件 安装失败
  15. 04 面向对象之:三大特性:继承(已讲),封装,多态。
  16. BoxCutter:吸附
  17. Michael Scofield in Break Prison(越狱)
  18. zoj-Swordfish-2022-5-6
  19. PEIF图片文件及python解析
  20. 《转》OpenWRT的Feeds分析学习

热门文章

  1. 关于Lasso回归的一个例子
  2. 结构力学求解器_结构力学学好这些内容对施工很关键,你都学懂了吗?
  3. c语言链表复数,[蓝桥杯][算法提高VIP]复数求和-链表初学者看过来(C语言代码)...
  4. 将数所有奇数移到数组前java_全国2014年4月自考Java语言程序设计(一)真题
  5. js怎么函数怎么给另一个函数传值并且不调用_2020年最火爆的Vue.js面试题
  6. python列表姓氏,Python程序可以打印完整姓氏的名字的缩写吗?
  7. 初中参观机器人博物馆的作文_导览机器人为参观者带来更佳的观展体验
  8. 【数据库系统原理】实体-联系模型
  9. html移动端缩放解决方案
  10. Windows核心编程_Edit操作