Oracle中的null vs空字符串

时间:2012-11-07 21:43:21

标签: oracle null oracle10g string

  

可能重复:
  Why does Oracle 9i treat an empty string as 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)|
+--------------+-----------+---------------+

创建此表后,我尝试交替插入以下INSERT命令。

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

由于在not null列上强制执行DESCRIPTION约束,因此两者都不成功。

在这两种情况下,Oracle都抱怨

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

在Oracle中,空字符串被视为NULL值。


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

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

并且指定的两个INSERT命令都将成功。他们会在null的{​​{1}}列中创建两行''和另一行DESCRIPTION。{/ p>

现在,如果我发出以下TEMP_TABLE命令,

SELECT

然后它会在SELECT * FROM temp_table WHERE description IS NULL; 列中提取其中一个具有null值而另一个具有空字符串''的行。

但是,以下DESCRIPTION语句不会从SELECT

中检索任何行
TEMP_TABLE

它甚至没有检索SELECT * FROM temp_table WHERE description=''; 列中包含空字符串的行。


据推测,似乎Oracle在此处理DESCRIPTION值和空字符串null的方式不同,但''语句似乎不是这样的不会将INSERT值和空字符串null插入到具有''约束的列中。为什么会这样?

2 个答案:

答案 0 :(得分:84)

这是因为Oracle在内部将空字符串更改为NULL值。 Oracle根本不会允许插入一个空字符串。

另一方面,SQL Server可以让你做你想要实现的目标。

这里有2个解决方法:

  1. 使用另一列说明“说明”字段是否有效
  2. 在“description”字段中使用一些虚拟值,您希望它存储空字符串。 (即将字段设置为'stackoverflowrocks',假设您的真实数据永远不会遇到这样的描述值)。
  3. 当然,两者都是愚蠢的解决方法:)

答案 1 :(得分:28)

在oracle中,空的varchar2和null被视为相同,您的观察结果显示出来。

当你写:

select * from table where a = '';

与写作相同

select * from table where a = null;

而不是a is null

永远不会等同于true,所以永远不要返回一行。在插入时,NOT NULL表示您无法插入null或空字符串(被视为null)