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可以让您实现您想要实现的目标

这里有两种变通方法:

  • 使用另一列说明“说明”字段是否有效
  • 对“description”字段使用一些伪值,您希望它存储空字符串。(即,假设您的真实数据永远不会遇到此类描述值,则将字段设置为“stackoverflowrocks”)

  • 当然,这两者都是愚蠢的解决方法:)

    在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的详细信息,请参见以下问题的答案:仅使用字符串还是使用其他数据类型?我不知道这一点。