Oracle的VARCHAR和VARCHAR2数据类型之间有什么区别?


Answers:


26

似乎Oracle曾经计划要给VARCHARVARCHAR2提供不同的定义。它已告知客户,建议不要使用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的奇偶校验。


我记得Oracle 8i中的varchar2,但是我不确定它是否与varchar相同。
bernd_k 2011年


有迹象表明,在8i之前的某个时候,定义可能有所不同。
Leigh Riffel

我以前认为varchar版本8之前的长度限制是不同的,但是我找不到任何值得支持的东西,现在想知道这是否只是一个神话。
杰克·道格拉斯

@Jack Douglas-我在Oracle 7文档中找不到关于此的任何内容。来自docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Oracle 7服务器>>服务器概念>> Oracle数据类型(无法直接链接到它)说的和以后差不多版本。在版本7文档的另一部分中,它说在版本6中,Varchar和Varchar2是char的同义词。
Leigh Riffel'4

25

当前,这两个是同义词。

VARCHAR是ANSI标准数据类型,但是Oracle对VARCHAR数据类型的实现通过将空字符串视为NULL来违反ANSI标准(Oracle的实现早于ANSI标准)。正如Leigh所指出的那样,Oracle已声明VARCHAR数据类型的语义将来可能会在如何处理空字符串方面发生变化。如果发生这种情况,则VARCHAR2数据类型的语义将保持不变。使用VARCHAR2数据类型更安全,因为您不必担心将来的Oracle版本会通过使空字符串不再被视为NULL来破坏代码。


3

因为在最初的SQL标准中,VARCHAR为255个字符,并且Oracle在当时至少要符合标准。


这给了人们几年后看到Oracle varchar3(max)的希望。
bernd_k 2011年

Sql-server没有问题,可以将允许的长度从255增加到8000(现在甚至可以增加到最大)。为什么Oracle需要其他数据类型。
bernd_k 2011年

1
无需使用varchar(max),只需使用CLOB
a_horse_with_no_name 2012年

3
CLOB与VARCHAR2具有不同的语义
Gaius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.