null与Oracle中的空string

可能重复:
为什么Oracle 9i将空string视为NULL?

我在Oracle 10g中有一个名为TEMP_TABLE的表,只有两列 – iddescription ,仅供参考。

id是生成的NUMBER(35, 0) not null主键的序列,列DESCRIPTIONVARCHAR2(4000) not null

在这种情况下,基本的表结构将如下所示。

 +--------------+-----------+---------------+ |Name | Null? | Type | +--------------+-----------+---------------+ |ID | NOT NULL | NUMBER(35) | |DESCRIPTION | NOT NULL | VARCHAR2(4000)| +--------------+-----------+---------------+ 

创build这个表后,我试着插入下面的INSERT命令。

 INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful 

它们都不成功,因为在DESCRIPTION列上强制使用not null约束。

在这两种情况下,甲骨文抱怨

 ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION") 

在Oracle中,空string被视为NULL值。


如果我在DESCRIPTION列上删除了not null约束,那么基本的表结构如下所示

 +--------------+-----------+---------------+ |Name | Null? | Type | +--------------+-----------+---------------+ |ID | NOT NULL | NUMBER(35) | |DESCRIPTION | | VARCHAR2(4000)| +--------------+-----------+---------------+ 

并且两个指定的INSERT命令都会成功。 它们将在TEMP_TABLEDESCRIPTION列中创build两个具有null值的行,另一个具有空string''

现在,如果我发出下面的SELECT命令,

 SELECT * FROM temp_table WHERE description IS NULL; 

那么它将提取两个行中的一个null值,另一个在DESCRIPTION列中有一个空string''

下面的SELECT语句从TEMP_TABLE检索没有行

 SELECT * FROM temp_table WHERE description=''; 

它甚至不检索DESCRIPTION列中有空string的行。


据推测,似乎Oracle在这里对null值和空string''不同'' ,但是对于INSERT语句来说, null值和空string都被阻止插入一个not null约束的列。 为什么这样?

这是因为Oracle内部将空string更改为NULL值。 Oracle根本不会让插入一个空string。

另一方面,SQL Server会让你做你想做的事情。

这里有两个解决方法:

  1. 使用另一列,说明'description'字段是否有效
  2. 在'description'字段中使用一些虚拟值来存储空string。 (即设置字段为“stackoverflowrocks”,假设您的真实数据将永远不会遇到这样的描述值)

两者当然都是愚蠢的解决方法:)

在oracle中,一个空的varchar2和null是相同的,你的观察结果显示。

当你写:

 select * from table where a = ''; 

它和写作一样

 select * from table where a = null; 

而不是a is null

这永远不会等同于真实,所以永远不要连续返回。 同样的插入,一个NOT NULL意味着你不能插入一个null或一个空string(这被视为一个空值)