Oracle中字段的确切NULL值是多少?

时间:2017-04-29 12:18:04

标签: oracle null

标题说得非常好。分配给(n)的确切值是什么a)算术b)字符串c)在Oracle DBMS中表示NULL的逻辑字段?

感谢您的时间!

3 个答案:

答案 0 :(得分:2)

Null是没有意义,缺乏价值。分配的内容是null。甚至不是ASCII null(ascii值0),但没有。

这就是为什么要测试null的特殊操作。这将返回false:

...
where col1 = null

我们需要测试:

where col1 is null
  “我们被大学的一位教授要求在这三个案例中找到这个价值究竟是什么”

好的,让我们调查一下。这是一个有两行的表:

SQL> create table t42 (
  2    type varchar2(10)
  3      , colv varchar2(10)
  4      , coln number
  5      , cold date
  6      )
  7 /

Table created.

SQL> insert into t42 values ('not null', 'X', 1, sysdate);

1 row created.

SQL> insert into t42 values ('all null', null, null, null);

1 row created.

SQL>Exp

Oracle有一个函数dump(),它向我们展示了传递值的数据类型和内容。 Find out more

dump()告诉我们关于我们两行的内容是什么?

SQL> select type
  2         , dump(colv) as colv
  3         , dump(coln) as coln
  4         , dump(cold) as cold
  5  from t42;

TYPE       COLV                 COLN                 COLD
---------- -------------------- -------------------- ----------------------------------
not null   Typ=1 Len=1: 88      Typ=2 Len=2: 193,2   Typ=12 Len=7: 120,117,4,29,6,60,44
all null   NULL                 NULL                 NULL

SQL> 

所以:null列没有数据类型,没有值。

  

“我不认为dump适合支持任何关于”确切“存储以表示null的参数 - 因为如果表达式为null,它只是按定义返回null”

@JeffreyKemp提出了一个公平的观点。所以让我们把脚趾插入内部。第一步是转储数据块; l将转储写入跟踪文件:

SQL> conn / as sysdba
Connected.
USER is "SYS"
SQL> select dbms_rowid.rowid_relative_fno(t42.rowid) as fno
  2         , dbms_rowid.rowid_block_number(t42.rowid) as blk
  3  from a.t42
  4  /

     FNO      BLK
-------- --------
      11      132
      11      132

SQL> alter system dump datafile 11 block 132;

System altered.

SQL> select value from v$diag_info where name = 'Default Trace File';

VALUE
--------------------------------------------------------------------------------
/home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_3275.trc

SQL> 

因为T42很小,所以它只适合一个区块。这是转储的有趣内容:

data_block_dump,data header at 0x805664
===============
tsiz: 0x1f98
hsiz: 0x16
pbl: 0x00805664
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f73
avsp=0x1f5d
tosp=0x1f5d
0xe:pti[0]  nrow=2  offs=0
0x12:pri[0] offs=0x1f7f
0x14:pri[1] offs=0x1f73
block_row_dump:
tab 0, row 0, @0x1f7f
tl: 25 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 8]  6e 6f 74 20 6e 75 6c 6c
col  1: [ 1]  58
col  2: [ 2]  c1 02
col  3: [ 7]  78 75 05 01 02 08 08
tab 0, row 1, @0x1f73
tl: 12 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 8]  61 6c 6c 20 6e 75 6c 6c
end_of_block_dump
End dump data blocks tsn: 33 file#: 11 minblk 132 maxblk 132

我们可以看到表格中有两行。第一行包含四列的条目;这是'not null'行。第二行只有一列:这是'all null'行。所以,杰弗里是对的。所有尾随字段都为空,因此Oracle不会为它们存储任何内容。

答案 1 :(得分:1)

来自APC的回答是完全正确的,让我们提供一些信息"它是什么意思":

  1. 算术:NULL基本上意味着"未定义"。 NULL的每个数学运算(即"未定义")也会返回NULL

  2. 字符串:NULL是一个空字符串,即'' IS NULL返回TRUE - Oracle的这种行为与许多其他RDBMS不同。

  3. 逻辑:我假设您的意思是BOOLEAN数据类型会发生什么。与PL / SQL中的几乎任何其他编程语言不同,BOOLEAN变量可以具有三个不同的状态:TRUEFALSENULL。在PL / SQL中使用BOOLEAN时,请注意这种特殊行为。

答案 2 :(得分:0)

除了@APC之外,在DB中还有类似“三元逻辑”的东西。在比较操作中,当我们可以说值相等,不相等而第三个是"我们不知道",因为它的值缺少NULL,甚至比较NULL值给出了NULL,表示我们没有关于操作数的信息