【问题标题】:What is the correct way of checking if varchar2 is empty?检查 varchar2 是否为空的正确方法是什么?
【发布时间】:2015-05-28 04:27:42
【问题描述】:

According to official 11g docs

Oracle 数据库当前处理长度为 零为空。然而,这在未来可能不会继续如此 版本,Oracle 建议您不要处理空字符串 与空值相同。

考虑一个函数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

有没有更简单的方法?

【问题讨论】:

  • 我也遵循相同的“如果 l_version 为 null 或 l_version = '' 那么”
  • @Alex 是的,你当然是对的。我在用那个评论装傻:/我会立即删除它......

标签: oracle plsql varchar varchar2


【解决方案1】:

假设您在整个代码中使用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,这是普遍接受的解释。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 在我的特定示例中,我不想区分。如果getVersion 返回null 或空的varchar2,我将填写一个硬编码的默认值(参见问题中的代码)。
    • 当然——我只是针对更广泛的问题。
    【解决方案3】:

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

    反正我的 2 美分。

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多