oracle 内部存储 笔记

dump blocktrace文件部分内容

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.026.0000727c  0x00800696.4411.10  C---    0  scn 0x0000.05d44076
0x02   0x0006.028.0000729f  0x00802b2a.3eac.2d  ----    3  fsc 0x0000.00000000
…
tab 0, row 5, @0x1d11
tl: 40 fb: --H-FL-- lb: 0x2  cc: 8
col  0: [ 3]  c2 4d 63
col  1: [ 5]  42 4c 41 4b 45
col  2: [ 7]  4d 41 4e 41 47 45 52
col  3: [ 3]  c2 4f 28
col  4: [ 7]  77 b5 05 01 01 01 01
col  5: [ 2]  c2 29
col  6: *NULL*
col  7: [ 2]  c1 1f
tab 0, row 6, @0x1d39
tl: 40 fb: --H-FL-- lb: 0x2  cc: 8
col  0: [ 3]  c2 4e 53
col  1: [ 5]  43 4c 41 52 4b
col  2: [ 7]  4d 41 4e 41 47 45 52
col  3: [ 3]  c2 4f 28
col  4: [ 7]  77 b5 06 09 01 01 01
col  5: [ 2]  c2 29
col  6: *NULL*
col  7: [ 2]  c1 0b
tab 0, row 7, @0x1e4c
tl: 40 fb: --H-FL-- lb: 0x2  cc: 8
col  0: [ 3]  c2 4e 59
col  1: [ 5]  53 43 4f 54 54
col  2: [ 7]  41 4e 41 4c 59 53 54
col  3: [ 3]  c2 4c 43

其中的col  5: [ 2]  c2 29以16进制存储,具体代表什么内容?

SQL> select utl_raw.cast_to_number('c229') from dual;
UTL_RAW.CAST_TO_NUMBER('C229')
------------------------------
4000

16进制转10进制:

utl_raw.cast_to_number

 

10进制转16进制:

utl_raw.cast_from_number
SQL> select utl_raw.cast_from_number('4000') from dual;
UTL_RAW.CAST_FROM_NUMBER('4000')
------------------------------
C229

 

数据类型的转换及存储:

 

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

 

dump的输出格式:

 

类型<[长度]>,符号/指数位 [数字1,数字2,... 数字20]

 

含义:

类型:typ=2,代表number型

长度:存储的字节数

符号、指数位

 

对正负数的存储:

正数:加1存储(避免null);

负数:被101减,如果长度小于21字节,需要在最后加102(为了排序的需要)

 

指数位换算:

正数:指数=符号/指数位-193(最高位为1代表正数)

负数:指数=62-第一字节

 

存储数据的计算方法:Σ数字位*100^(指数-N),N指有效位数的顺序位,第一个有效数N=0.

 

如:

Typ= Len= 2 : 194 , 41

指数=194-193=1

数字1=41-1=40*100^(1-0)=4000

 

摘自eygle《深入浅出oracle》

你可能感兴趣的:(内部存储)