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

时间:2015-05-27 17:15:33

标签: oracle plsql varchar varchar2

According to official 11g docs

  

Oracle数据库当前处理长度为的字符值   零为空。但是,将来这可能不会继续存在   发布,Oracle建议您不要处理空字符串   和nulls一样。

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

是否有一种不那么繁琐的方式?

3 个答案:

答案 0 :(得分:9)

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

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

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

  

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

听起来像律师进入了甲骨文的文档。我无法想象,在一百万年中,Oracle会突然改变用varchar2处理空字符串的方式,代码的TON会破坏(其中大部分是静默的)。文档中的这个陈述似乎是一个&#34;覆盖你的a&#34;以防万一。所以,继续使用&#34;为空&#34;别担心如果有的话,他们会改变varchar的行为,而不是varchar2。

我的2美分。