4

似乎 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 中存储为 null 吗?

好的,因此基于该结果,我现在希望以下查询返回所有 3 行,但仅显示{NULL}在第 1 行和第 3 行中。但是我得到了这个结果:

select * from tableA;

field1   field 2
-----------------------
1        {NULL} 
2        {NULL} 
3        {NULL} 

这令人困惑。我以为只有 2 个空值,尽管我最初预计是 1 个。那么这里发生了什么?set null不适用于 CLOB,如果可以,我应该改用什么?

我实际上是在尝试用空 CLOB 值解决一个不同的问题,但是这种令人困惑的行为让我运行了一段时间的环,所以我想在继续之前了解这一点。

提前致谢

博兹

4

3 回答 3

8

Oracle不区分NULL和空字符串。这是众所周知的违规或SQL标准。

这是默认字符串类型为VARCHAR2而不是的原因VARCHAR

在所有当前发布的版本中,它们都是相同的,但VARCHAR不建议使用。这是因为VARCHAR应该区分NULL和 一个空字符串,而VARCHAR2标准中没有描述的不是。

于 2011-01-27T11:08:22.137 回答
4

我认为这与 SQL*Plus 处理空字符串和空值的方式有关。

empty_clob()不会创建 NULL 值,而是创建长度为零的 CLOB。

当您查询 field2 为空的行时,不返回第 2 行这一事实证明了这一点。

使用我的 JDBC 工具,我可以用不同的颜色突出显示为 null 的列,并且带有 empty_clob() 的行没有突出显示,而其他两个则突出显示。

所以我会说这是对set nullSQL*Plus 中选项的错误处理。使用以下语句,您将看到不同之处:

选择字段1,
       nvl(field2, '这是 NULL')
来自表A;

对我来说,这显示:

字段 1 字段 2
----------------------
1 这是空的
2        
3 这是空的
于 2011-01-27T11:39:19.487 回答
2

看看第 2 行中的真正内容会很有趣。根据文档(见下文),它可能不是真正的 null .

在 SQL 查询工具中执行 SQL 语句时,尽管 Oracle 倾向于将 CLOB 隐式转换为以任意长度截断的字符串。

目的

EMPTY_BLOB 和 EMPTY_CLOB 返回一个空的 LOB 定位符,可用于初始化 LOB 变量,或者在 INSERT 或 UPDATE 语句中,将 LOB 列或属性初始化为 EMPTY。EMPTY 表示 LOB 已初始化,但未填充数据。

于 2011-01-27T11:19:15.760 回答