Oracle中的空字符串与空字符串
可能重复:Oracle中的空字符串与空字符串,oracle,null,oracle10g,string,Oracle,Null,Oracle10g,String,可能重复: 我在Oracle 10g中有一个名为TEMP_table的表,只有两列-id和description,只是为了演示 列id是序列生成的主键,类型为NUMBER(35,0)not null,列DESCRIPTION是VARCHAR2(4000)not null的类型 本例中的基本表结构如下所示 +--------------+-----------+---------------+ |Name | Null? | Type | +-----
我在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
由于说明
列上强制执行了非空
约束,这两个选项显然都不成功
在这两种情况下,甲骨文都抱怨道
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
空字符串在Oracle中被视为NULL
值。
如果我删除了
DESCRIPTION
列上的notnull
约束,那么基本表结构如下所示
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
指定的INSERT
命令都会成功。他们将在临时表
的说明
列中创建两行,一行为null
值,另一行为空字符串'
现在,如果我发出以下SELECT
命令
SELECT * FROM temp_table WHERE description IS NULL;
然后,它在描述
列中获取两行,其中一行具有null
值,另一行具有空字符串'
但是,下面的SELECT
语句没有从TEMP\u表中检索任何行
SELECT * FROM temp_table WHERE description='';
它甚至不检索在DESCRIPTION
列中有空字符串的行
想必,Oracle在这里似乎对
null
值和空字符串'
的处理方式有所不同,但是INSERT
语句似乎不是这样的,在该语句中,禁止将null
值和空字符串'
插入到非null
的列中约束。为什么会这样?这是因为Oracle在内部将空字符串更改为空值。Oracle根本不允许插入空字符串
另一方面,SQL Server可以让您实现您想要实现的目标
这里有两种变通方法:
当然,这两者都是愚蠢的解决方法:)在oracle中,空的varchar2和null被同等对待,您的观察结果表明了这一点 当你写作时:
select * from table where a = '';
这和写作一样
select * from table where a = null;
而非a为空
这永远不会等于true,所以永远不要返回一行。在insert上也是一样,NOT NULL表示不能插入NULL或空字符串(被视为NULL)您如何看到其中一个描述字段中有空字符串,而另一个字段中有空字符串?@Flansch-我假设使用这些
insert
语句,因为我不知道空字符串'
被转换成null
值,对不起。如果您比较7.3(不含java)和>=8.0(含java),您可能会想读这篇文章,尤其感兴趣。此外,子句where note(a=''
也永远不会是真的,因为a='
是a=null
,计算结果为未知
,而非(未知)
为未知
,这是不正确的。有关UNKNOWN的详细信息,请参见以下问题的答案:仅使用字符串还是使用其他数据类型?我不知道这一点。