9

根据官方 11g 文档

Oracle 数据库当前将长度为零的字符值视为空值。但是,在未来的版本中,这可能不会继续存在,Oracle 建议您不要将空字符串视为与 null 相同。

考虑一个getVersion返回 varchar2 的函数,它可能是''

l_version := x.getVersion;
if l_version is null then
  return 'V.1.0';
end if;

这将在当前的 Oracle 11g 上正常工作,但可能会在未来的 Oracle 版本''null.

我看到做上述未来证明的唯一方法是:

if l_version is null or l_version = '' then

有没有更简单的方法?

4

3 回答 3

10

假设您在varchar2整个代码中使用,l_version is null将是未来的证明。

varchar2当 ANSI 标准声明varchar应将 NULL 和空字符串视为单独的实体时, Oracle 创建了数据类型。其目的是varchar2数据类型的行为将在未来保持一致,而varchar将来可以使用新的标准 NULL 比较语义。当然,今天varcharvarchar2是彼此的同义词,它们至少已经存在了几十年,因此 Oraclevarchar在未来实际改变数据类型行为的可能性非常低。

当您查看数据类型的文档时VARCHAR2VARCHAR,它讨论VARCHAR了未来可能发生变化的比较语义。不幸的是,他们正在谈论的比较语义是 NULL 和空字符串之间的等价(或缺乏),这并不明确。但由于VARCHAR是 ANSI 标准数据类型,VARCHAROracle 和 ANSI 标准之间比较语义的唯一区别是空字符串是否为 NULL,这是普遍接受的解释。

不要使用 VARCHAR 数据类型。请改用 VARCHAR2 数据类型。尽管 VARCHAR 数据类型目前是 VARCHAR2 的同义词,但与不同的比较语义相比,VARCHAR 数据类型计划被重新定义为用于可变长度字符串的单独数据类型。

于 2015-05-27T18:13:25.867 回答
6

如果行为确实发生了变化,那么当这种情况可能发生时,您是否不希望能够区分空字符串和空字符串?换句话说,将空字符串和空值视为相同的未来证明代码可能需要在将来重新访问。

此外,目前全球 Oracle 数据库中存储的大约 1000 亿个空字符串将继续为空。

所以我的建议是忘记它,只使用 IS NULL。

于 2015-05-27T18:11:12.297 回答
0

听起来像律师进入了甲骨文的文档。我无法想象在一百万年后甲骨文会突然改变他们使用 varchar2 处理空字符串的方式,大量代码会被破坏(而且大部分都是默默地)。以防万一,文档中的此声明似乎是“覆盖您的 a$$”。所以,继续使用“is null”,不用担心。如果有的话,他们会改变 varchar 行为,而不是 varchar2。

反正我的2美分。

于 2015-05-27T20:27:42.343 回答