似乎SQLPLUS以我不期望的方式显示CLOB的空值和空字符串。
在SQLPLUS中尝试以下内容(我使用的是Oracle 10g服务器)。创建一个包含CLOB的表,并插入null,空clob,以及我认为的空字符串:
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,如果是,那么我应该使用什么呢?
我实际上是在尝试使用null CLOB值来解决另一个问题,但是这种令人困惑的行为让我运行了一段时间的响铃,所以在继续之前我想了解这一点。
提前致谢
博兹
答案 0 :(得分:8)
Oracle
不区分NULL
和空字符串。这是众所周知的违规行为或SQL
标准。
这是默认字符串类型为VARCHAR2
而不是VARCHAR
的原因。
在所有当前发布的版本中,它们是相同的,但不建议使用VARCHAR
。这是因为VARCHAR
应区分NULL
和空字符串,而标准中未描述的VARCHAR2
则不是。
答案 1 :(得分:3)
我认为这与SQL * Plus处理空字符串和空值的方式有关。
empty_clob()
不会创建NULL值,而是一个长度为零的CLOB。
当您查询field2为null的行时,未返回第2行的事实证明了这一点。
使用我的JDBC工具,我可以突出显示具有不同颜色的null的列,并且没有突出显示具有empty_clob()的行,而其他两个是。
所以我说这是对SQL * Plus中set null
选项的错误处理。通过以下声明,您将看到不同之处:
select field1, nvl(field2, 'THIS IS NULL') from tableA;
对我来说,这显示:
field1 field 2 ----------------------- 1 THIS IS NULL 2 3 THIS IS NULL
答案 2 :(得分:2)
看到第2行真正的内容会很有趣。根据documentation(见下文),empty_clob()将返回没有数据的初始化clob定位,这可能不会真正为空(在null问题上有点不清楚。)
在SQL查询工具中执行SQL语句时虽然Oracle倾向于将CLOB隐式转换为以任意长度切断的字符串。
目的
EMPTY_BLOB和EMPTY_CLOB返回一个空的LOB定位符,可用于初始化LOB变量,或者在INSERT或UPDATE语句中,将LOB列或属性初始化为EMPTY。 EMPTY表示LOB已初始化,但未填充数据。