首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle中的null与空字符串

Oracle中的null与空字符串
EN

Stack Overflow用户
提问于 2012-11-08 05:43:21
回答 2查看 177.2K关注 0票数 91

可能重复:

Why does Oracle 9i treat an empty string as NULL?

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

idNUMBER(35, 0) not null类型的序列生成的主键,列DESCRIPTIONVARCHAR2(4000) not null的类型。

本例中的基本表结构如下所示。

代码语言:javascript
复制
+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   | NOT NULL  | VARCHAR2(4000)|
+--------------+-----------+---------------+

在创建这个表之后,我尝试交替插入以下INSERT命令。

代码语言:javascript
复制
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, '');   ->unsuccessful

很明显,这两种方法都不成功,因为在DESCRIPTION列上强制使用了not null约束。

在这两个案例中,甲骨文都抱怨

代码语言:javascript
复制
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")

在Oracle中,空字符串被视为 NULL 值。

如果我删除DESCRIPTION列上的not null约束,那么基本表结构将如下所示

代码语言:javascript
复制
+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   |           | VARCHAR2(4000)|
+--------------+-----------+---------------+

并且指定的两个INSERT命令都将成功。它们将在TEMP_TABLEDESCRIPTION列中创建两行,一行具有null值,另一行具有空字符串''

现在,如果我发出以下SELECT命令,

代码语言:javascript
复制
SELECT * FROM temp_table WHERE description IS NULL;

然后,它获取其中一个行的null值和另一个行的DESCRIPTION列中的空字符串''的行。

但是,以下SELECT语句不从TEMP_TABLE中检索任何行

代码语言:javascript
复制
SELECT * FROM temp_table WHERE description='';

它甚至不检索DESCRIPTION列中有空字符串的行。

在这里,Oracle似乎以不同的方式对待null值和空字符串'',但INSERT语句中的情况似乎并非如此,在该语句中,禁止将null值和空字符串''插入到具有not null约束的列中。为甚麽呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-08 05:50:57

这是因为Oracle在内部将空字符串更改为空值。Oracle根本不允许插入空字符串。

另一方面,SQL Server会让您实现您想要实现的目标。

这里有两种解决方法:

  1. 使用另一列声明'description‘字段是否有效,
  2. 为'description’字段使用一些虚拟值,您希望它存储空字符串。(例如,假设您的实际数据永远不会遇到这样的描述值,将字段设置为'stackoverflowrocks‘)

当然,这两个都是愚蠢的变通方法:)

票数 117
EN

Stack Overflow用户

发布于 2012-11-08 05:52:47

在oracle中,空varchar2和null被同等对待,您的观察表明这一点。

当你写的时候:

代码语言:javascript
复制
select * from table where a = '';

和写作是一样的

代码语言:javascript
复制
select * from table where a = null;

而不是a is null

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

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13278773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档