null与Oracle中的空string
可能重复:
为什么Oracle 9i将空string视为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)| +--------------+-----------+---------------+
创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_TABLE
的DESCRIPTION
列中创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会让你做你想做的事情。
这里有两个解决方法:
- 使用另一列,说明'description'字段是否有效
- 在'description'字段中使用一些虚拟值来存储空string。 (即设置字段为“stackoverflowrocks”,假设您的真实数据将永远不会遇到这样的描述值)
两者当然都是愚蠢的解决方法:)
在oracle中,一个空的varchar2和null是相同的,你的观察结果显示。
当你写:
select * from table where a = '';
它和写作一样
select * from table where a = null;
而不是a is null
这永远不会等同于真实,所以永远不要连续返回。 同样的插入,一个NOT NULL意味着你不能插入一个null或一个空string(这被视为一个空值)