将来自其他 DBMS 的表迁移到 Oracle 时,标准任务之一是将所有VARCHAR(n)
字段替换为VARCHAR2(n)
字段(前提是 n <= 4000)。
为什么 Oracle 将这种数据类型称为这种数据类型VARCHAR2
,而不是VARCHAR
像其他 DBMS 那样?
将来自其他 DBMS 的表迁移到 Oracle 时,标准任务之一是将所有VARCHAR(n)
字段替换为VARCHAR2(n)
字段(前提是 n <= 4000)。
为什么 Oracle 将这种数据类型称为这种数据类型VARCHAR2
,而不是VARCHAR
像其他 DBMS 那样?
似乎 Oracle 曾经计划为VARCHAR提供与VARCHAR2不同的定义。它已经告诉客户这一点,并建议不要使用VARCHAR。无论他们的计划是什么,从 11.2.0.2 开始,VARCHAR与VARCHAR2相同。下面是SQL 语言参考 11g 第 2 版所说的:
PL/SQL 用户指南和参考 10g 第 2 版是这样说的:
Database Concepts 10g 第 2 版文档用更强烈的措辞说了同样的话:
Oracle 9.2 和 8.1.7 文档说的基本相同,因此即使 Oracle 一直不鼓励使用VARCHAR,到目前为止,他们还没有做任何事情来改变它与VARCHAR2的奇偶性。
目前,两者是同义词。
VARCHAR 是 ANSI 标准数据类型,但 Oracle 对 VARCHAR 数据类型的实现违反了 ANSI 标准,将空字符串视为 NULL(Oracle 的实现早于 ANSI 标准)。正如 Leigh 所指出的,Oracle 已声明 VARCHAR 数据类型的语义在未来可能会根据处理空字符串的方式发生变化。如果发生这种情况,VARCHAR2 数据类型的语义将保持不变。使用 VARCHAR2 数据类型更安全,因为您不必担心某些未来版本的 Oracle 会通过导致空字符串不再被视为 NULL 来破坏您的代码。
因为在最初的 SQL 标准中,VARCHAR 是 255 个字符,而当时 Oracle 至少在标准合规性方面有所尝试。
目前 VARCHAR2 通过使用基于字符数的字节来优化内存使用。这意味着,如果 VARCHAR2(10) 变量包含较少数量的字符,它可以使用 2、4、5、6 等字节的内存。
而 VARCHAR 是固定大小。VARCHAR(10) 将始终保存 10 个字节的内存。