空VS在甲骨文空字符串[复制](null vs empty string in Oracle [du

2019-06-19 01:14发布

可能重复:
为什么甲骨文9i中把一个空字符串为NULL?

我有一个名为Oracle 10g中的表TEMP_TABLE只有两栏- iddescription只是为了演示的目的。

id是生成的类型的主键的序列NUMBER(35, 0) not null和列DESCRIPTION是一种类型的VARCHAR2(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")

一个空字符串被处理为NULL Oracle中值。


如果我放弃了not null的约束DESCRIPTION列则基本表的结构将类似于以下

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

并且两个的INSERT命令,指定能够成功。 他们将创建两行一用一null值,另一个为空字符串''DESCRIPTION中的列TEMP_TABLE

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

SELECT * FROM temp_table WHERE description IS NULL;

然后它提取两个,其中一个具有行null值,而另一个具有一个空字符串''DESCRIPTION列中。

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

SELECT * FROM temp_table WHERE description='';

它甚至没有检索其在一个空字符串行DESCRIPTION列。


据推测,看来,甲骨文把一个null值和一个空字符串''不同的位置然而这似乎并不符合的情况下INSERT ,其中两个声明null值和空字符串''都被插入防止有一列not null约束。 为什么会这样呢?

Answer 1:

这是因为Oracle在内部改变空字符串NULL值。 甲骨文根本不会让插入一个空字符串。

在另一方面,SQL服务器将让你做你想要达到的目的。

这里有2个解决方法:

  1. 使用,指出该“说明”字段是否有效与否的另一列
  2. 使用一些虚拟价值,你想让它来存储空字符串的“说明”字段。 (即设置字段是“stackoverflowrocks”假设你的真实数据永远不会遇到这样的描述值)

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



Answer 2:

在甲骨文空的VARCHAR2和无效的处理方式相同,并且你的观察表明。

当你写:

select * from table where a = '';

它与下面的写法

select * from table where a = null;

而不是a is null

这绝不等同于真实的,所以不要返回一行。 同样在插入件,一个NOT NULL意味着你不能插入空或空字符串(其为一个空处理的)



文章来源: null vs empty string in Oracle [duplicate]