可能重复:
为什么甲骨文9i中把一个空字符串为NULL?
我有一个名为Oracle 10g中的表TEMP_TABLE
只有两栏- id
和description
只是为了演示的目的。
列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
约束。 为什么会这样呢?