检查 varchar2 是否为空的正确方法是什么?

What is the correct way of checking if varchar2 is empty?

According to official 11g docs

Oracle Database currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.

考虑一个函数 getVersion returns 一个可能是 '':

的 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

有没有更简单的方法?

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

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

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

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

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

当您查看 documentation for the VARCHAR2 and VARCHAR data types 时,它谈到了 VARCHAR 的比较语义可能在未来发生变化。不幸的是,他们谈论的比较语义是 NULL 和空字符串之间的等价(或不等价)并不明确。但是由于 VARCHAR 是 ANSI 标准数据类型,并且 Oracle 和 ANSI 标准之间 VARCHAR 比较语义的唯一区别是空字符串是否为 NULL,这是普遍接受的解释。

Do not use the VARCHAR datatype. Use the VARCHAR2 datatype instead. Although the VARCHAR datatype is currently synonymous with VARCHAR2, the VARCHAR datatype is scheduled to be redefined as a separate datatype used for variable-length character strings compared with different comparison semantics.

听起来像是律师进入了 Oracle 的文档。我无法想象在一百万年后 Oracle 会突然改变他们使用 varchar2 处理空字符串的方式,大量代码会中断(而且大部分代码都是默默地)。文档中的这条语句似乎是 "cover your a$$" 以防万一。所以,继续使用 "is null" 就可以了,不用担心。如果有的话,他们会改变 varchar 的行为,而不是 varchar2。

反正我的 2 美分。