在二进制中表示NULL

时间:2015-01-28 16:01:16

标签: oracle plsql null binary storage

在PL / SQL DATE数据类型中存储固定长度值。它们以二进制格式存储,但以默认格式显示为字符。

考虑以下声明:

v_regdate DATE;

此处v_regdate未初始化,因此其值为NULL。只是想知道如何以二进制格式存储NULL。

3 个答案:

答案 0 :(得分:4)

如果给定日期(实际上,任何数据类型)变量/列的值为null,则不存储任何内容。 Null只是简写,nada,zip(至少就存储的数据而言)。

您可以从此测试用例中看到:

create table test (col1 number, col2 date);

insert into test (col1) values (1);

insert into test (col1, col2) values (2, sysdate);

commit;

select col1,
       to_char(col2, 'dd/mm/yyyy hh:mi:ss') col2,
       dump(col1) col1_dump,
       dump(col2) col2_dump
from   test;


      COL1 COL2                COL1_DUMP            COL2_DUMP                               
---------- ------------------- -------------------- ----------------------------------------
         1                     Typ=2 Len=2: 193,2   NULL                                    
         2 28/01/2015 11:12:33 Typ=2 Len=2: 193,3   Typ=12 Len=7: 120,115,1,28,12,13,34     

drop table test;

注意" NULL"通过转储col2报告的空值;这意味着"此行中没有任何内容存储此行"。

答案 1 :(得分:2)

  

在PL / SQL中,DATE数据类型存储固定长度值...

那不太对劲。日期有一个使用七个字节的内部表示,是的,所有实际日期的长度都是七个字节,如果你想这样看的话。您可以在{@ 1}}中找到@ boneist的答案,所以我不会重复它。

但是一个空值并没有将这七个字节全部设置为某种东西 - 如果这是你正在寻找的东西,它就不是一个神奇的值;例如,它不是0x00的七个字节。 null变量的长度为零字节。

答案 2 :(得分:2)

请记住,Oracle没有定义如何为给定的数据类型存储null,因为null的定义确实是“未定义”。这就是为什么,例如:

SELECT 1 来自双重 WHERE NULL = NULL;

什么都不返回。你不能将一个“未定义”与另一个“未定义”进行比较并期望等效。