结论:
1, NUMBER的类型编码Typ为2
2, 如果数值为负数那么需要在最后面补一位102,正数和零则不需要
之所以这样处理,是为了更加方便的进行两个数值的大小比较。Oracle在进行数据库中两个数值大小比较的时候,直接比较他们在数据库中的存储格式,并不是把他们转化成我们常用的数值形式后在比较。比如说:比较0和1这两个数,0在数据库中表示为128,1在数据库中表示为193,2,那么直接进行比较‘128’小于‘193’,所以0肯定比1要小。在比如说1和0.12这两个数比较,0.12在数据库中表示为192.13,因为‘193’大于‘192’,所以1肯定比0.12大。这个规则对于正数和0完全适用,但是对于不补位的负数就要出麻烦了。看下面的例子:
SQL> select dump(-0.12) from dual;
DUMP(-0.12)
----------------------
Typ=2 Len=3: 63,89,102
SQL> select dump(-0.125) from dual;
DUMP(-0.125)
-------------------------
Typ=2 Len=4: 63,89,51,102
如果不补位的话-0.12应该为63,89,而-0.125应该为63,89,51,那么按照前面的规则来说‘63’等于‘63’,‘89’等于‘89’,‘51’肯定要大于空,就可以得出错误的结论-0.12小于-0.125。而当在负数后面补上102后,情况就完全改变了,就可以很快的得到正确的大小关系。
3, 转化规则
(1)数值在数据库中存储结构的第一位叫做标志位,是整个数值表示中最关键的一位。
如果标志位大于128,那么该数值为正数
如果标志位等于128,那么该数值为0
如果标志位小于128,那么该数值为负数
例如:
数值0的标志位为128,所以为0
数值0.12的标志位为192,所以0.12为正数
数值-34.56的标志位为62,所以-34.56为负数
(2)数据库中存储结构的除了第一位其余的为数值位
如果该数值为正数,那么每位上的实际数值等于数据库中存储的数值减1
如果该数值为负数,那么每位上的实际数值等于101减去数据库中存储的数值,最后补位的102不用计算。
例如:
数值1的数字为2 – 1 = 1
数值-1的数字为 101 – 100 = 1
数值34.56的数字为35 – 1 = 34,57 – 1 = 56,即3456
数值-34.56的数字为101 – 67 = 34,101 – 45 = 56,即3456
(3)确定小数点位置
确定小数点的位置需要标志位和第一位共同来决定
如果该数值为正数,那么该数值的前几位应该为第一位 * power(100,(标志位 – 193))
如果该数值为负数,那么该数值的前几位应该为第一位 * power(100,(62–标志位))
例如:
34.56 Typ=2 Len=3: 193,35,57,该数值的前几位应该为34*power(100,0)=34,所以34.56的小数点应该在4的后面,那么就可以得到该数值为34.56
-34.56 Typ=2 Len=4: 62,67,45,102该数值的前几位应该为34*power(100,0)=34,所以34.56的小数点应该在4的后面,那么就可以得到该数值为-34.56