进行插入时,空字符串将转换为 null:
insert into test (f) values ('');
现在,有一行 f 包含一个空值。
但是,当我查询表时,我不能使用'':
select * from test where f='';
no rows selected
我可以使用空值:
select * from test where f is null;
____F_
NULL
所以......看来Oracle决定空字符串不能用于插入,但在执行查询时它们仍然是空字符串。关于空字符串何时变为 null 以及何时保持为空字符串的文档在哪里?
这说明了一切:
SQL小提琴
2件事:
1)在插入
''
时转换为。NULL
那是甲骨文VARCHAR2
的事情。2)
select * from test where f='';
正在尝试 doselect * from test where f=NULL
,它没有定义,并且不会返回任何内容,因为NULL
不喜欢相等运算符。您必须使用IS NULL
或IS NOT NULL
。我将补充一点,
CHAR
数据类型的行为不同,因为它是填充的。Oracle 将 '' 和 NULL 视为相同。插入 '' 时,不会将 '' 转换为 NULL,而只是将 '' 解释为
NULL
与单词 NULL 被解释为NULL
或 rtrim('a','a') 被解释为 相同的方式NULL
。这是使用下表和插入的演示:
上面的插入为 c1 插入了一个 NULL 值。您可以按如下方式选择该行:
当您添加 WHERE 子句来比较相等性并且要比较的值之一为 NULL 时,结果将始终是未知的。Unknown 将评估为 false,除非对未知值的进一步操作会产生未知值。以下所有内容均不返回任何行,因为 WHERE 子句包含无论数据如何都永远不会为真的条件。
Oracle 提供了一种特殊的语法来检索具有空值的特定列的行——
IS NULL
。在某些情况下,oracle 会比较 NULLS,将它们视为等于其他 NULL 值,例如在 DECODE 语句和复合键中。
更多信息可以在SQL 语言参考中找到。
Oracle RDBMS 在空字符串和空字符串之间没有任何区别;这意味着没有将空字符串转换为空值的转换。
我可以理解,这两个都不包含信息。
这解释了一点: