当前位置: 首页 > news >正文

深入解析下oracle的number底层存储格式

     oracle数据库中,number数据类型用来存储数值数据,它既可以存储负数数值,也可以存储正数数值。相对于其他类型数据,number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。

一、环境搭建

1.1,创建表

    我们还是创建表t_code,并插入数据。

1.2,根据数据rowid,获取数据文件号和数据块id 

二、获取底层存储数据

2.1,dump数据块

    我们根据rowid得到的数据存储的位置,通过oracle命令dump块信息到日志。

 

2.2,dump函数获取数据信息

 2.3,比对

    我们根据dump出来的数据块信息与dump函数信息比对,可以看到两边数据一致,那么我们直接用dump函数获取数据分析:

三、存储格式分析

3.1,详细解析

     oracle内部,number数据类型的内部代表码为2,也就是上面图中的TYP=2。根据这个内部码,oracle内部程序就知道该表该列的类型具体为什么。

    len=2,代表此列数据的长度为2。

    number数据类型底层存储分为两部分:一部分为指数字节位(占一个字节),其余为数字字节位(占多个字节),如:

Typ=2 Len=3: 194,4,3

    指数字节位值为194;数字字节位值为:4,3 

    指数字节位分为3部分:符号位,偏移量和指数值

    符号位:符号位占一个bit位,位于byte的最高位。为1代表0或者正数,为0代表负数。

    偏移量:偏移量默认值为65,二进制值为:1000001

    指数值:指数值的范围为-65...62,它需要byte位的实际值减去偏移量获得。指数基数为100.

3.2,正数算法

    我们以表t_code序号为302的数据进行计算底层数据存储。

    符号byte位值为194,二进制值为:11000010,可以看到:符号为1,所以为正数。

    194-128=66,得到指数值为66,66的二进制值为1000010,减去65得到1(65+128=193)。所以最高位指数为1。

    数字位基数为100,由于底层每个数字位加了1,故计算时候需要减1。

    下面我们开始计算302数值如何得到:

3.3,负数算法 

    我们以表t_code序号为-13596.1的数据进行计算底层数据存储格式。

    符号位值为60,故符号bit位位0,所以为负数。

    负数的指数计算需要利用数值62(62+65=127),62为负数计算基数。62-60=2,所以最高位指数为2。

    负数数值计算基数需要101减去对应数值位。

    

http://www.lryc.cn/news/501542.html

相关文章:

  • nginx代理rabbitmq和配置 Nginx 代理达梦数据库
  • 汉语唤醒词的模糊判断(Python)
  • Redis篇-2--原理篇1--I/O多路复用机制(5种I/O模型,I/O多路复用)
  • Knowledge Graph Studio:让知识图谱构建更简单、更智能
  • vue 中实现音视频播放进度条(可拖拽,满足常见开发需求)
  • [免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】
  • 笔记:在WPF中BitmapSource都有哪些派生类,他们主要功能,使用方法,使用场景
  • JAVA基础学习笔记_多线程
  • 什么是自动化办公
  • 数据库系统
  • 文件系统--底层架构(图文详解)
  • 【OCR】——端到端文字识别GOT-OCR2.0不香嘛?
  • SkyWalking 和 ELK 链路追踪实战
  • ETCD的封装和测试
  • 基于大数据爬+数据可视化的民族服饰数据分析系统设计和实现(源码+论文+部署讲解等)
  • torch.optim.lr_scheduler.ReduceLROnPlateau
  • Linux 搭建ftp服务
  • 阳光电源嵌入式面试题及参考答案
  • PS的功能学习(形状、文字、图层)
  • 项目实例_FashionMNIST_CNN
  • Ubuntu 安装 web 服务器
  • burp的编解码,日志,比较器
  • 2.1、模版语法
  • 最小二乘法拟合出二阶响应面近似模型
  • 【汽车】-- 常见的汽车悬挂系统
  • VMware Workstation Pro 17 下载 以及 安装 Ubuntu 20.04.6 Ubuntu 启用 root 登录
  • 记录ubuntu22.04重启以后无法获取IP地址的问题处理方案
  • linux 删除系统特殊的的用户帐号
  • core Webapi jwt 认证
  • 【Redis】Redis基础——Redis的安装及启动