用二进制表示 NULL

Representing NULL in binary

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

考虑以下声明:

v_regdate DATE;

这里v_regdate没有初始化,因此它的值为NULL。只是想知道 NULL 如何以二进制格式存储。

如果给定日期(实际上是任何数据类型)变量/列的值为空,则不会存储任何内容。 Null 只是 shorthand 什么都没有,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;

注意 col2 的转储报告的 "NULL" 空值;这意味着 "there is nothing stored in this column for this row".

In PL/SQL DATE datatype stores fixed length values ...

这不太正确。一个日期有一个使用七个字节的内部表示,是的,所有实际日期的长度都是七个字节,如果你想这样看的话。你可以在@boneist 的回答中的 dump() 中看到,所以我不会重复它。

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

请记住,Oracle 没有定义如何为给定数据类型存储 null,因为 null 的定义实际上是 "NOT DEFINED"。这就是为什么,例如:

SELECT 1 从双 其中 NULL = NULL;

returns 没什么。您不能将一个 "undefined" 与另一个 "undefined" 进行比较并期待等效性。