可能重复:
Why does Oracle 9i treat an empty string as NULL?
我在Oracle10g中有一个名为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
很明显,这两种方法都不成功,因为在DESCRIPTION
列上强制使用了not null
约束。
在这两个案例中,甲骨文都抱怨
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
在Oracle中,空字符串被视为 NULL
值。
如果我删除DESCRIPTION
列上的not null
约束,那么基本表结构将如下所示
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
并且指定的两个INSERT
命令都将成功。它们将在TEMP_TABLE
的DESCRIPTION
列中创建两行,一行具有null
值,另一行具有空字符串''
。
现在,如果我发出以下SELECT
命令,
SELECT * FROM temp_table WHERE description IS NULL;
然后,它获取其中一个行的null
值和另一个行的DESCRIPTION
列中的空字符串''
的行。
但是,以下SELECT
语句不从TEMP_TABLE
中检索任何行
SELECT * FROM temp_table WHERE description='';
它甚至不检索DESCRIPTION
列中有空字符串的行。
在这里,Oracle似乎以不同的方式对待null
值和空字符串''
,但INSERT
语句中的情况似乎并非如此,在该语句中,禁止将null
值和空字符串''
插入到具有not null
约束的列中。为甚麽呢?
发布于 2012-11-08 05:50:57
这是因为Oracle在内部将空字符串更改为空值。Oracle根本不允许插入空字符串。
另一方面,SQL Server会让您实现您想要实现的目标。
这里有两种解决方法:
当然,这两个都是愚蠢的变通方法:)
发布于 2012-11-08 05:52:47
在oracle中,空varchar2和null被同等对待,您的观察表明这一点。
当你写的时候:
select * from table where a = '';
和写作是一样的
select * from table where a = null;
而不是a is null
它永远不会等于true,所以永远不要返回一行。与insert相同,NOT NULL表示不能插入null或空字符串(被视为null)
https://stackoverflow.com/questions/13278773
复制相似问题