dump block的内容解析(varchar2 number date)实验

     对于dump block出来的字段内容一直都很好奇,碰巧看到老杨的blog对oracle基本数据类型存储格式,于是做了个试验。下面的两条数据就是dump出来的内容,图中字段截取了部分(要不然图太长了)。

dump  block 的内容,截取前两条数据:

block_row_dump:

tab 0, row 0, @0x1bc7

tl: 77 fb: --H-FL-- lb: 0x1  cc: 12

col  0: [ 8]  44 45 4d 4f 54 41 42 31--varchar2类型

col  1: *NULL*

col  2: [ 4]  c3 06 0e 2f--number类型

col  3: [ 4]  c3 06 0e 2f

col  4: [ 5]  54 41 42 4c 45

col  5: [ 7]  78 70 07 1d 0c 34 2f--date类型

col  6: [ 7]  78 70 07 1d 0c 34 2f

col  7: [19]  32 30 31 32 2d 30 37 2d 32 39 3a 31 31 3a 35 31 3a 34 36

col  8: [ 5]  56 41 4c 49 44

col  9: [ 1]  4e

col 10: [ 1]  4e

col 11: [ 1]  4e

tab 0, row 1, @0x1b77

tl: 80 fb: --H-FL-- lb: 0x1  cc: 12

col  0: [11]  53 48 4f 57 5f 53 50 41 43 45 31

col  1: *NULL*

col  2: [ 4]  c3 06 0e 30

col  3: *NULL*

col  4: [ 9]  50 52 4f 43 45 44 55 52 45

col  5: [ 7]  78 70 07 1d 0d 01 0e

col  6: [ 7]  78 70 07 1d 0d 07 22

col  7: [19]  32 30 31 32 2d 30 37 2d 32 39 3a 31 32 3a 30 36 3a 33 33

col  8: [ 5]  56 41 4c 49 44

col  9: [ 1]  4e

col 10: [ 1]  4e

col 11: [ 1]  4e

block中的字符逆转换:44 45 4d 4f 54 41 42 31表示varchar2 DEMOTAB1

     select to_number('4445','xxxx')from dual;--17477
    
select to_number('4d4f','xxxx')from dual;--19791
    
select to_number('5441','xxxx')from dual;--21569
    
select to_number('4231','xxxx')from dual;--16945          
    
select chr(17477)from dual;--DE
    
select chr(19791)from dual;--MO
    
select chr(21569)from dual;--TA
    
select chr(16945)from dual;--B1

block中的number逆转换:c3 06 0e 2f 表示的number 51346

OracleNUMBER类型最多由三个部分构成,这三个部分分别是最高位表示位、数据部分、符号位。其中负数包含符号位,正数不会包括符号位。另外,数值0比较特殊,它只包含一个数值最高位表示位80,没有数据部分。C3表示位     

     select to_number('6','xx'from dual;--6 -1
     select to_number(
'0e','xx'from dual;--14-1
     select to_number(
'2f','xx'from dual;--47-1

block中的Date逆转换:78 70 07 1d 0c 34 2f 表示的date 2012-07-29 11:51:46

日期类型长度是77个字节分别表示世纪、年、月、日、时、分和秒。

由于时、分、秒都会出现0的情况,因此存储时采用原值加1的方式。0时保存为113时保存为1423时保存为24。分和秒的情况与小时类似。小时的范围是023,在数据库中以124保存。分和秒的范围都是059,在数据库中以160保存。

年和世纪的情况相对比较复杂,可分为公元前和公元后两种情况。由于最小的世纪的值是-47(公元前4712年),最大值是99(公元9999年)。为了避免负数的产生,oracle把世纪加100保存在数据库中。公元2000年,世纪保存为120,公元9999年,世纪保存为199,公元前101年,世纪保存为99100+(-1)),公元前4712年,世纪保存为53100+(-47)。年的保存与世纪的保存方式类似,也把年的值加上100进行保存。对于公元2000年,年保持为100,公元1年保存为101.

  select to_number('78','xx')from dual;--120-100世纪
  
select to_number('70','xx')from dual;--112-100
  
select to_number('07','xx')from dual;--7
  
select to_number('1d','xx')from dual;--29
  
select to_number('0c','xx')from dual;--12-1
  
select to_number('34','xx')from dual;--52-1
  
select to_number('2f','xx')from dual;--47-1 

 参考http://www.itpub.net/thread-699527-1-1.html 参考老杨的Oracle基本数据类型存储格式浅析。

你可能感兴趣的:(dump block的内容解析(varchar2 number date)实验)