将来自其他 DBMS 的表迁移到 Oracle 时,标准任务之一是将所有VARCHAR(n)字段替换为VARCHAR2(n)字段(前提是 n <= 4000)。
为什么 Oracle 称这种数据类型VARCHAR2而不是VARCHAR像其他 DBMS 一样?
Lei*_*fel 26
似乎甲骨文曾计划为VARCHAR 提供与VARCHAR2不同的定义。它已经告诉客户这一点并建议不要使用VARCHAR。无论他们的计划是什么,从 11.2.0.2 开始,VARCHAR与VARCHAR2相同。以下是SQL 语言参考 11g 第 2 版的说明:
不要使用 VARCHAR 数据类型。请改用 VARCHAR2 数据类型。尽管 VARCHAR 数据类型目前与 VARCHAR2 同义,但与不同的比较语义相比,VARCHAR 数据类型计划重新定义为用于可变长度字符串的单独数据类型。
在PL / SQL用户指南和参考10g第2版是这样说的:
目前,VARCHAR 是 VARCHAR2 的同义词。但是,在 PL/SQL 的未来版本中,为了适应新兴的 SQL 标准,VARCHAR 可能成为具有不同比较语义的单独数据类型。最好使用 VARCHAR2 而不是 VARCHAR。
该数据库概念10g第2版的文件说,在强烈的措辞同样的事情:
VARCHAR 数据类型与 VARCHAR2 数据类型同义。为避免行为可能发生的变化,请始终使用 VARCHAR2 数据类型来存储可变长度的字符串。
Oracle 9.2 和 8.1.7 文档说的基本上是一样的,所以即使 Oracle 一直不鼓励使用VARCHAR,但到目前为止他们还没有做任何事情来改变它与VARCHAR2 的对等。
Jus*_*ave 26
目前,两者是同义词。
VARCHAR 是 ANSI 标准数据类型,但 Oracle 对 VARCHAR 数据类型的实现将空字符串视为 NULL(Oracle 的实现早于 ANSI 标准)违反了 ANSI 标准。正如 Leigh 指出的那样,Oracle 已经声明 VARCHAR 数据类型的语义在未来可能会在如何处理空字符串方面发生变化。如果发生这种情况,VARCHAR2 数据类型的语义将保持不变。使用 VARCHAR2 数据类型更安全,因为您不必担心某些未来版本的 Oracle 会导致空字符串不再被视为 NULL 从而破坏您的代码。