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(这被视为一个空值)