oracle的数据类型number存放格式

SQL> select ‘SMITH’,dump(‘SMITH’),dump(‘SMITH’,16) from dual;

'SMIT DUMP(‘SMITH’) DUMP(‘SMITH’,16)


SMITH Typ=96 Len=5: 83,77,73,84,72 Typ=96 Len=5: 53,4d,49,54,48
而在trace中看到如下内容:
col 1: [ 5] 53 4d 49 54 48
S M I T H
这是ASCII标准码所规定的。

再看number类型
SQL> select 7369,dump(7369),dump(7369,16) from dual;

  7369 DUMP(7369)             DUMP(7369,16)

  7369 Typ=2 Len=3: 194,74,70 Typ=2 Len=3: c2,4a,46

难点在于194,193,192这类数字的定义
定义是 0-256 0:ff ,
所以在10进制里,定义的中点是128,用来表示0

-10000 , 60
-100 , 61
-1 ,62
-0.1 , 63
0 , 128
0.1 , 192
1 , 193
100 , 194
10000 , 195
1000000, 196
100000000,197
10000000000, 198

select 0,dump(0),1,dump(1),10,dump(10) from dual;
select 100,dump(100),1000,dump(1000),10000,dump(10000) from dual;
select 100000,dump(100000),1000000,dump(1000000),10000000,dump(10000000) from dual;
select 10000000000,dump(10000000000) from dual;

select 0.1,dump(0.1),0.01,dump(0.01),0.5,dump(0.5) from dual;
select -0.1,dump(-0.1),-0.01,dump(-0.01),-0.5,dump(-0.5) from dual;
select 0,dump(0),-1,dump(-1),-10,dump(-10) from dual;
select -100,dump(-100),-10000,dump(-10000) from dual;
select 100000,dump(100000),1000000,dump(1000000),10000000,dump(10000000) from dual;
select 10000000000,dump(10000000000) from dual;

SQL> select dump(1) from dual;
DUMP(1)

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

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

Typ=2 Len=2: 194,2
SQL> select dump(101) from dual;
DUMP(101)

Typ=2 Len=3: 194,2,2
内部的算法是 1属于193的第一个数字,用2减去1就是1。而99是193的最大一位数字,100减去1就是99.
100属于194的第一个数字,2减去1就是1.而194的1代表的是100
而101分成2部分, 100归在194的2,而1归在193的2,所以看到是194,2,2
先看数字属于哪个区间,然后再以个位,百位,万位,百万位,亿位来划分数字。再来拆分,
我们继续看小数点的影响:

select dump(1.9999) from dual;
select dump(1.99) from dual;
select dump(1.01) from dual;
select dump(1.001) from dual;
select dump(1.10) from dual;
select dump(99.1) from dual;
select dump(99.01) from dual;

SQL> set pages 200 lines 200
SQL> select dump(1.9999) from dual;
DUMP(1.9999)

Typ=2 Len=4: 193,2,100,100
SQL> select dump(1.99) from dual;
DUMP(1.99)

Typ=2 Len=3: 193,2,100
SQL> select dump(1.01) from dual;
DUMP(1.01)

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

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

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

Typ=2 Len=3: 193,2,11
SQL> select dump(99.1) from dual;
DUMP(99.1)

Typ=2 Len=3: 193,100,11
SQL> select dump(99.01) from dual;
DUMP(99.01)

Typ=2 Len=3: 193,100,2

oracle的数字设计的很有意思。
小数点以两位为单位,0.01最小就是2,而0.99最大就是100, 减去1就得到数字。

所以7369,属于少于10000,应该是194区间,而74-1=73,而70-1=69 。
所以十进制里应该存放的是194,74,70 三个数字,算法含义是低于10000的数字,前2位是73,后两位是69.
而194,74,70转换为十六进制是C2,4A,46 这样3个数字。
而我们对比dump出来的格式:

tl: 38 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4a 46
至此,才完成了number类型的解释和学习。

你可能感兴趣的:(oracle的数据类型number存放格式)