【问题标题】:Representing NULL in binary用二进制表示 NULL
【发布时间】:2015-03-27 14:55:18
【问题描述】:

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

考虑以下声明:

v_regdate DATE;

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

【问题讨论】:

  • 我不确定你的问题是否有意义。没有什么可以存储空值。这不是什么神奇的值,它是 no 值。
  • 日期是一个固定长度的数据类型。因此 v_regdate 变量需要在内存中有一些代表 NULL 的值。
  • 假设类型的内部/内存表示只是它的值,而是某种具有语义或相关元数据的结构,可以表明它持有一个空值

标签: oracle plsql null binary storage


【解决方案1】:

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

选择 1 从双 WHERE NULL = NULL;

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

【讨论】:

  • 您非常接近事实,但据我所知,null 和 undefined 之间仍然存在差异。 NULL 只是 NULL,将 NULL 与 NULL 进行比较(如您的示例中所示),给出结果 UNDEFINED,它既不是 TRUE 也不是 FALSE。更详细的解释在这里:psinke.nl/blog/hello-world
【解决方案2】:

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

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

但是 null 值并没有将这七个字节全部设置为某个值 - 如果这就是您要查找的值,那么它不是一个神奇的值;例如,它不是 0x00 的七个字节。为 null 的变量的长度为零字节。

【讨论】:

  • 所以当 DATE 为 NULL 时,作为固定长度数据类型的 DATE 不成立。
  • @davison - 为什么你认为它是固定长度的数据类型?也许会分裂头发,但我不确定你从哪里得到这个词。所有允许的日期都用七个字节表示,但它是一种内部表示——如果你愿意,它是一个实现细节。而且 null 是深不可测的......
  • @AlexPoole 我同意我可能误解了这一行“日期数据存储在每个七个字节的固定长度字段中”。感谢您清理它docs.oracle.com/cd/B28359_01/server.111/b28318/…
  • @Alex - 在the documentation:“大小固定为 7 个字节” ....{该死,这会教我在发表评论之前不要刷新!}
  • 是的,显然至少在两个地方。但我认为这只是有点误导 - 如果您看到 typ=12/13,它对于解释转储很有用,尽管如果它 went into more detail 会更有用。类似的讨论适用于各种时间戳类型。
【解决方案3】:

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

注意 col2 的转储报告的“NULL”为空值;这意味着“该行的该列中没有存储任何内容”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2021-12-21
    • 2011-04-17
    • 2011-10-27
    • 2016-05-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多