Tin*_*iny 75 string oracle null oracle10g
可能重复:
为什么Oracle 9i将空字符串视为NULL?
我在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)|
+--------------+-----------+---------------+
Run Code Online (Sandbox Code Playgroud)
创建此表后,我尝试INSERT
交替插入以下命令.
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
Run Code Online (Sandbox Code Playgroud)
它们都不成功,因为not null
在DESCRIPTION
列上强制执行约束.
在这两种情况下,Oracle都抱怨道
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
Run Code Online (Sandbox Code Playgroud)
空字符串NULL
在Oracle中被视为值.
如果我删除了列not null
上的约束,DESCRIPTION
那么基本表结构将如下所示
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
Run Code Online (Sandbox Code Playgroud)
并且INSERT
指定的两个命令都将成功.他们将创建两行一用一null
值,另一个为空字符串''
中DESCRIPTION
的列TEMP_TABLE
.
现在,如果我发出以下SELECT
命令,
SELECT * FROM temp_table WHERE description IS NULL;
Run Code Online (Sandbox Code Playgroud)
然后它获取其中一个具有null
值而另一个''
在DESCRIPTION
列中具有空字符串的行.
SELECT
但是,以下语句不会从中检索任何行TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
Run Code Online (Sandbox Code Playgroud)
它甚至不检索列中具有空字符串的DESCRIPTION
行.
据推测,似乎Oracle 在这里对null
值和空字符串的处理方式''
不同,但是对于不能将值和空字符串都插入到具有约束的列中的INSERT
语句似乎不是这种情况.为什么会这样?null
''
not null
Vai*_*sai 93
这是因为Oracle在内部将空字符串更改为NULL值.Oracle根本不会允许插入一个空字符串.
另一方面,SQL Server会让你做你想要实现的目标.
这里有2个解决方法:
当然,两者都是愚蠢的变通办法:)
Daz*_*zaL 28
在oracle中,空的varchar2和null被视为相同,并且您的观察显示了这一点.
当你写:
select * from table where a = '';
Run Code Online (Sandbox Code Playgroud)
它和写作一样
select * from table where a = null;
Run Code Online (Sandbox Code Playgroud)
并不是 a is null
永远不会等同于真,所以永远不要返回一行.在插入时,NOT NULL意味着您无法插入null或空字符串(被视为null)