【问题标题】:null vs empty string in Oracle [duplicate]Oracle中的null与空字符串[重复]
【发布时间】:2015-04-23 05:13:32
【问题描述】:

可能重复:
Why does Oracle 9i treat an empty string as NULL?

我在 Oracle 10g 中有一个名为 TEMP_TABLE 的表,只有两列 - iddescription 只是为了演示。

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

它们都没有成功,因为not null 约束是在DESCRIPTION 列上强制执行的。

在这两种情况下,甲骨文都抱怨

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_TABLEDESCRIPTION 列中创建两行,一个具有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 约束的列中。为什么会这样?

【问题讨论】:

  • 您如何看到其中一个描述字段为空字符串,而另一个字段为空?
  • @Flansch- 大概,我假设那些INSERT 语句,因为我不知道空字符串'' 被转换成null 值,对不起。
  • 您可能想阅读this

标签: oracle null oracle10g string


【解决方案1】:

这是因为 Oracle 在内部将空字符串更改为 NULL 值。 Oracle 根本不会让插入一个空字符串。

另一方面,SQL Server 可以让你做你想要达到的目标。

这里有两种解决方法:

  1. 使用另一列说明“描述”字段是否有效
  2. 在您希望它存储空字符串的“描述”字段中使用一些虚拟值。 (即将字段设置为“stackoverflowrocks”,假设您的真实数据永远不会遇到这样的描述值)

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

【讨论】:

  • 只有字符串还是其他数据类型也是这样?
  • 我不知道。
【解决方案2】:

在 oracle 中,空 varchar2 和 null 被视为相同,您的观察表明了这一点。

当你写作时:

select * from table where a = '';

和写作一样

select * from table where a = null;

而不是a is null

这永远不会等于真,所以永远不要返回一行。插入时相同,NOT NULL 表示您不能插入 null 或空字符串(被视为 null)

【讨论】:

  • 如果您比较 7.3(不带 java)和 >=8.0(带 java),这会特别感兴趣。
  • 此外,子句where not(a = '') 也永远不会为真,因为a = ''a = null,其计算结果为UNKNOWN,而not(UNKNOWN)UNKNOWN,这是不正确的。关于 UNKNOWN 的详细信息,另见stackoverflow.com/questions/2692046/…的答案
猜你喜欢
  • 2013-12-01
  • 2020-10-10
  • 2017-03-31
  • 1970-01-01
  • 2014-09-22
  • 2014-07-25
  • 2022-10-22
  • 2017-06-12
  • 2012-07-18
相关资源
最近更新 更多