处理过Oracle数据库的每个人都知道,字符字段和变量必须声明为 VARCHAR2,而不是VARCHAR。
但这些数据类型似乎是同义词:
CREATE TABLE table1 (
id number,
text VARCHAR(10),
text2 VARCHAR2(10)
);
Name Null Type
----- ---- ------------
ID NUMBER
TEXT VARCHAR2(10)
TEXT2 VARCHAR2(10)
那么它们之间有什么区别呢?
目前它们是同义词。
VARCHAR保留在将来Oracle支持和空字符串之间的区别,如标准中所述。NULLANSIVARCHAR2不区分NULL和空字符串,永远不会。如果您依赖空字符串并且
NULL相同,请使用VARCHAR2.@Quassnoi答案的翻译
目前,没有区别。类型
VARCHAR是别名VARCHAR2,将替换为VARCHAR2.VARCHAR保留用于将来的版本以符合 ANSI/ISO-SQL 标准,Oracle不推荐这种类型。因此,每个人都使用该类型VARCHAR2,因为它的行为永远不会改变。与标准有什么区别
VARCHAR2,有两个:空字符串被解释为
NULL带长度NULL(不是 0)NULL在字符串连接期间被忽略,在标准中这种连接的结果将是NULL为什么会发生(解释@JustinCave缩写):
Oracle是数据库市场上非常老的供应商。在 SQL 尚未标准化的时候,Oracle理论家做出了一个设计决定,即数据库字段中的空字符串不包含信息,实际上是
NULL.随着时间的推移,当 SQL 标准出现并确定
NULL空字符串本质上有所不同时,已经有很多使用旧代码的用户没有考虑到这种差异。因此,Oracle面临着使现有代码无效或违反 SQL 标准的选择。根据Oracle的说法,一个破坏性较小的决定是保留数据类型VARCHAR以供更改和符合 SQL 标准并引入新的数据类型VARCHAR2,其行为保证不变。何时会做出预期的行为改变
VARCHAR?这是版本 7中的情况,请注意短语 - “在 Oracle7 的下一个版本中”:
而且,20 多年后,在19c 版中:
正确的答案是它们在使用方面没有区别;存储时,VARCHAR2 不会为 NULL 值保留空间,这与 VARCHAR 不同,即 用于存储(这对管理员很重要)。https://stackoverflow.com/questions/1171196/what-is-the-difference-between-varchar-and-varchar2-in-oracle的答案不正确。对于 VARCHAR 或 VARCHAR2 处理 NULL 没有区别(将来 VARCHAR 和 VARCHAR2 之间可能会有区别,但现在确实没有区别)。以下示例说明了相同的行为: