NULL与Oracle中的空字符串



可能的重复:
Oracle 9i为什么将空字符串视为空?

我在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列上执行。

在两种情况下,Oracle抱怨

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约束的列。为什么这样?

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

另一方面,SQL Server可以让您执行要实现的目标。

这里有2个解决方法:

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

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

在甲骨文中,空的varchar2和null相同,并且您的观察结果表明。

写作时:

select * from table where a = '';

与写作相同

select * from table where a = null;

而不是a is null

永远不会等于true,所以永远不要返回一行。在插入物上相同的是,无效的表示您不能插入空字符串或空字符串(被视为null)

相关内容

  • 没有找到相关文章

最新更新