[20130301]clob字段的empty_clob与NULL.txt

简介: [20130301]clob字段的empty_clob与NULL.txt工作需要,开始研究一下clob字段.看看函数empty_clob()与null的区别.1.建立测试环境:SQL> select * from v$version where rownumBA...
[20130301]clob字段的empty_clob与NULL.txt

工作需要,开始研究一下clob字段.看看函数empty_clob()与null的区别.

1.建立测试环境:
SQL> select * from v$version where rownum

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER           VALUE     
------------------- ---------
NLS_CHARACTERSET    ZHS16GBK

--安装的语言选择NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

create table t ( id number,c clob);
insert into t values (1,empty_clob());
insert into t values (2,NULL);
commit ;

SQL> column c format a30
SQL> select rowid,t.* from t ;

ROWID                      ID C
------------------ ---------- ------------------------------
AABB0EAAEAAAAWeAAA          1
AABB0EAAEAAAAWeAAB          2

SQL> @lookup_rowid AABB0EAAEAAAAWeAAA

    OBJECT       FILE      BLOCK        ROW
---------- ---------- ---------- ----------
    269572          4       1438          0

--保证写到磁盘.
SQL> alter system checkpoint;
System altered.

2.使用bbed观察:
BBED> set dba   4,1438
        DBA             0x0100059e (16778654 4,1438)

BBED> map /v
 File: /u01/app/oracle11g/oradata/test/users01.dbf (4)
 Block: 1438                                  Dba:0x0100059e
------------------------------------------------------------
 KTB Data Block (Table/Cluster)

 struct kcbh, 20 bytes                      @0
    ub1 type_kcbh                           @0
    ub1 frmt_kcbh                           @1
    ub1 spare1_kcbh                         @2
    ub1 spare2_kcbh                         @3
    ub4 rdba_kcbh                           @4
    ub4 bas_kcbh                            @8
    ub2 wrp_kcbh                            @12
    ub1 seq_kcbh                            @14
    ub1 flg_kcbh                            @15
    ub2 chkval_kcbh                         @16
    ub2 spare3_kcbh                         @18

 struct ktbbh, 72 bytes                     @20
    ub1 ktbbhtyp                            @20
    union ktbbhsid, 4 bytes                 @24
    struct ktbbhcsc, 8 bytes                @28
    sb2 ktbbhict                            @36
    ub1 ktbbhflg                            @38
    ub1 ktbbhfsl                            @39
    ub4 ktbbhfnx                            @40
    struct ktbbhitl[2], 48 bytes            @44

 struct kdbh, 14 bytes                      @100
    ub1 kdbhflag                            @100
    sb1 kdbhntab                            @101
    sb2 kdbhnrow                            @102
    sb2 kdbhfrre                            @104
    sb2 kdbhfsbo                            @106
    sb2 kdbhfseo                            @108
    sb2 kdbhavsp                            @110
    sb2 kdbhtosp                            @112

 struct kdbt[1], 4 bytes                    @114
    sb2 kdbtoffs                            @114
    sb2 kdbtnrow                            @116

 sb2 kdbr[2]                                @118

 ub1 freespace[8017]                        @122

 ub1 rowdata[49]                            @8139

 ub4 tailchk                                @8188

BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0]                              @8139     0x2c

BBED> x /2rnc
rowdata[0]                                  @8139
----------
flag@8139: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8140: 0x01
cols@8141:    1

col    0[2] @8142: 2

rowdata[6]                                  @8145
----------
flag@8145: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8146: 0x01
cols@8147:    2

col    0[2] @8148: 1
col   1[36] @8151: .T.................s................

--可以发现两者存在不同,empty_clob()并占用36字节[如果加上前面的长度指示器,占用37字节],而NULL不占用空间.

BBED> p  *kdbr[0]
rowdata[6]
----------
ub1 rowdata[6]                              @8145     0x2c

BBED> x /r
rowdata[6]                                  @8145
----------
flag@8145: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8146: 0x01
cols@8147:    2

col    0[2] @8148:  0xc1  0x02
col   1[36] @8151:  0x00  0x54  0x00  0x01  0x02  0x0c  0x80  0x00  0x00  0x02
                    0x00  0x00  0x00  0x01  0x00  0x00  0x01  0xdd  0xf4  0x73 
                    0x00  0x10  0x09  0x00  0x00  0x00  0x00  0x00  0x00  0x00  
                    0x00  0x00  0x00  0x00  0x00  0x00

SQL> alter system dump datafile 4 block 1438;
System altered.

--看看转储文件:
Block header dump:  0x0100059e
 Object id on Block? Y
 seg/obj: 0x41d04  csc: 0x00.c010a962  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000598 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.020.00003023  0x00c006e2.1675.0a  --U-    2  fsc 0x0000.c010a966
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x0100059e
data_block_dump,data header at 0x2a972c5264
===============
tsiz: 0x1f98
hsiz: 0x16
pbl: 0x2a972c5264
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f67
avsp=0x1f4e
tosp=0x1f4e
0xe:pti[0]  nrow=2  ffs=0
0x12:pri[0] ffs=0x1f6d
0x14:pri[1] ffs=0x1f67
block_row_dump:
tab 0, row 0, @0x1f6d
tl: 43 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [36]                    
 00 54 00 01 02 0c 80 00 00 02  
 00 00 00 01 00 00 01 dd f4 73  
 00 10 09 00 00 00 00 00 00 00  
 00 00 00 00 00 00
LOB
Locator:
  Length:        84(36)
  Version:        1
  Byte Length:    2
  LobID: 00.00.00.01.00.00.01.dd.f4.73
  Flags[ 0x02 0x0c 0x80 0x00 ]:
    Type: CLOB
    Storage: BasicFile
    Enable Storage in Row
    Characterset Format: IMPLICIT
    Partitioned Table: No
    Options: VaringWidthReadWrite
  Inode:
    Size:     16
    Flag:     0x09 [ Valid DataInRow ]
    Future:   0x00 (should be '0x00')
    Blocks:   0
    Bytes:    0
    Version:  00000.0000000000
    Inline data[0]
Dump of memory from 0x0000002A972C71FC to 0x0000002A972C71FC
tab 0, row 1, @0x1f67
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 1438 maxblk 1438

--11G版本转储的显示很清晰:

Header 占10bytes   : 00 54 00 01 02 0c 80 00 00 02
LOBID  占10bytes   : 00 00 00 01 00 00 01 dd f4 73
. LOB ID is a 10 byte number identifying individual instance of a LOB
. Allocated when LOB value is created including EMPTY_CLOB() etc
. Format is  where
      is a currently unknown 4-byte number (always 1)
      is a 6-byte number generated from sequence SYS.IDGEN1$

SQL> @16to10  01ddf473
16 to 10 DEC
------------
    31323251

SQL> select * from dba_sequences where sequence_owner='SYS' and sequence_name ='IDGEN1$';

SEQUENCE_OWNER                 SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ------------------------------ ---------- ---------- ------------ - - ---------- -----------
SYS                            IDGEN1$                                 1 1.0000E+28           50 N N       1000    31323651

Inode 占用16bytes
Body Length占2bytes: 00 10     => 等于16也就是36-前面的20字节(header的长度+lobid的长度)=16.
Flags      占2bytes: 09 00
LOB Length 占6bytes: 00 00 00 00 00 00      ==>empty_clob() 长度为0,clob自身长度为0
Version    占6bytes: 00 00 00 00 00 00


总结:
1.从以上可以看出,clob字段NULL与empty_clob()是不同的。
2.如果clob字段有信息,除了保存信息外额外要消耗36字节来保存相关信息。
3.其他问题看后续的帖子。

目录
相关文章
|
5月前
|
SQL 数据库
MyBatisPlus-null判定及查询指定字段
MyBatisPlus-null判定及查询指定字段
623 0
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
消息中间件 NoSQL Kafka
实时计算 Flink版产品使用合集之在进行全量同步时,有两张表的数据没有正确进入,并且ID字段为null,该怎么处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
8天前
|
存储 JSON BI
关于建表字段是否该使用not null这个问题你怎么看?
V哥分享了在数据库设计中使用 `NOT NULL` 的重要性及应用场景。关键字段如用户名和邮箱应设为 `NOT NULL` 以确保数据完整性;可选字段如中间名和个人资料图片允许 `NULL` 提供更多灵活性。`NULL` 还可用于表示未知状态,如未发货的订单。外键设计需根据业务逻辑决定是否使用 `NOT NULL`。此外,`NOT NULL` 可优化查询性能,但在扩展性和数据兼容性方面,允许 `NULL` 更具优势。结合业务需求和数据统计,合理使用 `NOT NULL` 可确保数据完整性和灵活性。
|
3月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
48 7
|
2月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
50 0
|
3月前
|
SQL 存储 索引
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
|
4月前
|
分布式计算 DataWorks 数据可视化
MaxCompute产品使用问题之mongo离线同步导致null的字段不显示该怎么办
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
222 1
|
4月前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之启用hive兼容的时候,某个字段是null,是否会把这个字段当成空白连起来
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
存储 关系型数据库 MySQL
Flink CDC中mysql cdc 抽取这个时间字段的值为null 有什么好的解决方案吗 ?
Flink CDC中mysql cdc 抽取这个时间字段的值为null 有什么好的解决方案吗 ?
209 0