可能的重复:
Oracle 9i为什么将空字符串视为空?
我在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
它们两个都没有成功,因为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_TABLE
的DESCRIPTION
列中创建两个具有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个解决方法:
- 使用另一列说明"描述"字段是否有效
- 对"描述"字段使用一些虚拟值,您希望它存储空字符串。(即,假设您的真实数据永远不会遇到这样的描述值,则将字段设置为" stackoverflowrocks")
当然,两者都是愚蠢的解决方法:)
在甲骨文中,空的varchar2和null相同,并且您的观察结果表明。
写作时:
select * from table where a = '';
与写作相同
select * from table where a = null;
而不是a is null
永远不会等于true,所以永远不要返回一行。在插入物上相同的是,无效的表示您不能插入空字符串或空字符串(被视为null)