Home  >  Article  >  Database  >  Oracle Database 中关于null值的存储

Oracle Database 中关于null值的存储

WBOY
WBOYOriginal
2016-06-07 17:58:451081browse

这里主要验证了number 和 varchar2 两种数据类型null值的存储 先来介绍一下row piece的结构 引用官方文档的一张结构图 通常情况下,不包括(cluster table 和 chain row)一个rowpiece 包括row header 和 column data 关于其他情况,会在以后的研究中陆续放

 

这里主要验证了number 和 varchar2 两种数据类型null值的存储

先来介绍一下row piece的结构

 

 

引用官方文档的一张结构图


 

 

通常情况下,不包括(cluster table 和 chain row)一个rowpiece 包括row header 和 column data

关于其他情况,会在以后的研究中陆续放出。

BBED> dump /v
File: /u01/apps/Oracle/oradata/david/users01.dbf(4)
Block: 531     Offsets: 8173to 8191  Dba:0x01000213
-------------------------------------------------------
3c020302 c1020353 59530444 55414c01 l<...>
06fbd4                            l .ûÔ

例如:一个rowpiece的前3个字节 3c0203它表示

1个字节的flag
1个字节的lb(itl slot)
1个字节的columncount

如例中
3c=flag=00111100=--HDFL--=header+delete+first+last
02=lb itl slot 0x02
03=column count


列值信息包括:
列的长度,列的value
例如02c102
表示占用2个byte
c102 表示的是具体的值

dump 的信息 可以使用 UTL_RAW.CAST_TO_xxxx 来翻译(感谢itpub iori809的指导)

 

 


 

下面开始验证

首先环境为11.1.0.6 linux x64

  1. dex@FAKE> desc ts  
  2.  Name                                                              Null?    Type  
  3.  ----------------------------------------------------------------- -------- --------------------------------------------   
  4.  ID                                                                         NUMBER  
  5.  NAME                                                                       VARCHAR2(20)  
  6.  COUNT                                                                      NUMBER  
  7.   
  8.   
  9. dex@FAKE> select t.*,  
  10.   2         dbms_rowid.rowid_relative_fno(t.rowid) as "FNO#",  
  11.   3         dbms_rowid.rowid_block_number(t.rowid) as "BLK#",  
  12.   4         dbms_rowid.rowid_row_number(t.rowid) as "ROW#"  
  13.   5    from dex.ts t  
  14.   6  ;  
  15.   
  16.   
  17.         ID NAME                      COUNT       FNO#       BLK#       ROW#  
  18. ---------- -------------------- ---------- ---------- ---------- ----------   
  19.          1 dd                                       4         31          0  
  20.          2                               2          4         31          1  
  21.            2                             3          4         31          2  
  22.          4                                          4         31          3  

 

建表语句:dex@FAKE> create table ts ( id number , name varchar2(20) , count number ) ;
因为表中没有使用long 类型的column,所以表中列的顺序和建表中的列的声明顺序相同。
BBED> set dba 4,31
        DBA             0x0100001f (16777247 4,31)
BBED> map
 File: /u01/apps/Oracle/oradata/fake/users01.dbf (4)
 Block: 31                                    Dba:0x0100001f
------------------------------------------------------------
 KTB Data Block (Table/Cluster)


 struct kcbh, 20 bytes                      @0       


 struct ktbbh, 72 bytes                     @20      


 struct kdbh, 14 bytes                      @100     


 struct kdbt[1], 4 bytes                    @114     


 sb2 kdbr[3]                                @118     


 ub1 freespace[8036]                        @124     


 ub1 rowdata[28]                            @8160    


 ub4 tailchk                                @8188    
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn