为什么SQLPLUS将空CLOB和null CLOB显示为null?
SQLPLUS似乎以一种我没有预料到的方式为clob显示null和空字符串 在SQLPLUS中尝试以下操作(我使用的是oracle10gserver)。创建一个带有CLOB的表,并插入null、空CLOB和我认为的空字符串:为什么SQLPLUS将空CLOB和null CLOB显示为null?,sql,oracle,null,sqlplus,clob,Sql,Oracle,Null,Sqlplus,Clob,SQLPLUS似乎以一种我没有预料到的方式为clob显示null和空字符串 在SQLPLUS中尝试以下操作(我使用的是oracle10gserver)。创建一个带有CLOB的表,并插入null、空CLOB和我认为的空字符串: create table tableA (field1 number, field2 clob); insert into tableA values (1, null); insert into tableA values (2, empty_clob()); inser
create table tableA (field1 number, field2 clob);
insert into tableA values (1, null);
insert into tableA values (2, empty_clob());
insert into tableA values (3, '');
好的,让我们进行一些查询,但首先我们需要告诉SQLPLUS为我们清楚地显示空值:
set null {NULL}
对于以下查询,我希望只返回第1行,但它返回2行:
select * from tableA where field2 is null;
field1 field 2
-----------------------
1 {NULL}
3 {NULL}
嗯,那么'
在CLOB中存储为空
好的,基于这个结果,我现在希望下面的查询返回所有3行,但只在第1行和第3行显示{NULL}
。然而,我得到了这个结果:
select * from tableA;
field1 field 2
-----------------------
1 {NULL}
2 {NULL}
3 {NULL}
这令人困惑。我原以为只有2个空值,尽管我最初预期为1。这是怎么回事?set null
对CLOB不起作用吗?如果是,我应该用什么来代替
实际上,我正试图用空CLOB值解决一个不同的问题,但这种令人困惑的行为让我运行Ring有一段时间了,所以我想在继续之前了解一下这一点
提前谢谢
Boz
Oracle
不区分NULL
和空字符串。这是一个众所周知的违反或SQL
标准的行为
这就是默认字符串类型为VARCHAR2
而不是VARCHAR
的原因
在所有当前发布的版本中,它们都是相同的,但不建议使用
VARCHAR
。这是因为VARCHAR
应该区分NULL
和空字符串,而标准中没有描述的VARCHAR2
则不是。看看第2行到底是什么会很有趣。它可能不是真正的null,因为(见下文)empty_clob()将返回一个没有数据的初始化clob locate(对于null问题有些不清楚)
在SQL查询工具中执行SQL语句时,尽管Oracle倾向于隐式地将CLOB转换为以任意长度截断的字符串
目的
EMPTY_BLOB和EMPTY_CLOB返回一个空LOB定位器,可用于初始化LOB变量,或在INSERT或UPDATE语句中,将LOB列或属性初始化为空。EMPTY表示LOB已初始化,但未填充数据。我认为这与SQL*Plus处理空字符串和空值的方式有关
empty\u clob()
不会创建空值,而是创建长度为零的clob
当查询字段2为null的行时,第2行不会返回,这一事实证明了这一点
使用我的JDBC工具,我可以用不同的颜色高亮显示空的列,其中带有空的_clob()的行不会高亮显示,而其他两行则会高亮显示
所以我想说,在SQL*Plus中,对setnull
选项的处理是错误的。通过以下陈述,您将看到差异:
select field1,
nvl(field2, 'THIS IS NULL')
from tableA;
选择字段1,
nvl(字段2,“此为空”)
来自表A;
对我来说,这显示:
field1 field 2
-----------------------
1 THIS IS NULL
2
3 THIS IS NULL
字段1字段2
-----------------------
1这是空的
2.
3这是空的