深入解析下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减去对应数值位。
原文地址:https://blog.csdn.net/tpc4289/article/details/144367494
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!