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
是否有一种不那么繁琐的方式?
答案 0 :(得分:9)
假设您在整个代码中使用varchar2
,l_version is null
将来会证明。
当ANSI标准声明varchar2
应该将NULL和空字符串视为单独的实体时,Oracle创建了varchar
数据类型。目的是varchar2
数据类型的行为将继续保持一致,而将来varchar
可以使用新的标准NULL比较语义。当然,今天varchar
和varchar2
是彼此的同义词,并且它们已经存在了至少几十年,因此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美分。