Answers:
目前,它们是同义词。
VARCHAR
保留,Oracle
以支持NULL
将来与空字符串之间的区别,这是ANSI
标准规定的。
VARCHAR2
不区分a NULL
和空字符串,也永远不会。
如果您依赖空字符串并且NULL
是同一件事,则应使用VARCHAR2
。
VARCHAR2
因为当前没有表现出VARCHAR
应有的类型。实际上,VARCHAR
在正确实施之前,您根本不应使用。
当前,VARCHAR的行为与VARCHAR2完全相同。但是,VARCHAR
不应使用该类型,因为它保留供将来使用。
VARCHAR
不应使用@PhilipRego 。我编辑了它
取自最新的稳定的Oracle生产版本12.2: 数据类型
的主要区别在于,VARCHAR2
为内部数据类型和VARCHAR
是一个外部数据类型。因此,我们需要了解内部和外部数据类型之间的区别...
在数据库内部,值存储在表的列中。在内部,Oracle用称为内部数据类型的特定格式表示数据。
通常,OCI(Oracle呼叫接口)应用程序不能使用数据的内部数据类型表示形式,而可以使用由编写语言所预定义的宿主语言数据类型。在OCI客户端应用程序和数据库表之间传输数据时,OCI库会在内部数据类型和外部数据类型之间转换数据。
外部类型使程序员可以使用宿主语言类型而不是专有数据格式来为程序员提供便利。在Oracle数据库和OCI应用程序之间传输数据时,OCI可以执行各种数据类型转换。OCI外部数据类型比Oracle内部数据类型更多。
的VARCHAR2
数据类型是具有4000个字节的最大长度字符的可变长度的字符串。如果init.ora参数max_string_size为默认值,则a的最大长度VARCHAR2
可以为4000字节。如果init.ora参数max_string_size =扩展,则a的最大长度VARCHAR2
可以是32767字节
的VARCHAR
不同长度的数据类型存储字符串。前两个字节包含字符串的长度,其余字节包含字符串。绑定或定义调用中字符串的指定长度必须包含两个长度字节,因此VARCHAR
可以接收或发送的最大字符串长度为65533字节,而不是65535。
在12.2数据库快速测试表明,作为内部数据类型中,Oracle仍然把一个VARCHAR
作为假对VARCHAR2
。它不是SYNONYM
Oracle中的实际对象类型。
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
VARCHAR
ProC / C ++预编译器选项也有一些含义。对于感兴趣的程序员,链接位于:Pro * C / C ++程序员指南
经过一些试验(请参阅下文),我可以确认,截至2017年9月,接受的答案中描述的功能没有任何变化:-
NULL
s插入。VARCHAR
VARCHAR2
这两个关键字的历史原因在回答一个不同问题时得到了很好的解释。
VARCHAR最多可以存储2000个字节的字符,而VARCHAR2最多可以存储4000个字节的字符。
如果我们将数据类型声明为VARCHAR,则它将占用NULL值的空间。对于VARCHAR2数据类型,它将不为NULL值占用任何空间。例如,
name varchar(10)
即使名称为“ Ravi__”,也将保留6个字节的内存,而
name varchar2(10)
将根据输入字符串的长度保留空间。例如,“ Ravi__”的4个字节的内存。
_代表NULL。
注意:varchar将为空值保留空间,而varchar2将不为空值保留任何空间。
VARCHAR
使用CHAR
。
目前,它们是相同的。但是以前
VARCHAR
NULL
正如ANSI标准所规定的那样,Oracle保留了Oracle以支持将来区分空字符串。
VARCHAR2
不区分a NULL
和空字符串,也永远不会。
Emp_name varchar(10)
-如果输入的值小于10位,则剩余空间无法删除。它总共使用了10个空格。
Emp_name varchar2(10)
-如果您输入的值小于10位数字,则剩余空间会自动删除
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;