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)
8 回答
至于现在,它们是同义词 .
VARCHAR
由Oracle
保留,以支持将来NULL
和空字符串之间的区别,如ANSI
标准规定 .VARCHAR2
不区分NULL
和空字符串,永远不会 .如果你依赖空字符串和
NULL
是同一个东西,你应该使用VARCHAR2
.Currently VARCHAR behaves exactly the same as VARCHAR2. However, this type should not be used as it is reserved for future usage.
取自:Difference Between CHAR, VARCHAR, VARCHAR2
取自最新稳定的Oracle 生产环境 版本12.2:Data Types
主要区别在于
VARCHAR2
是内部数据类型,VARCHAR
是外部数据类型 . 所以我们需要了解内部和外部数据类型之间的区别......在数据库内部,值存储在表的列中 . 在内部,Oracle以特定格式表示数据,称为内部数据类型 .
通常,OCI(Oracle调用接口)应用程序不能与数据的内部数据类型表示一起使用,而是使用由编写它们的语言预定义的宿主语言数据类型 . 在OCI客户端应用程序和数据库表之间传输数据时,OCI库会在内部数据类型和外部数据类型之间转换数据 .
外部类型通过使用主机语言类型而不是专有数据格式,为程序员提供了便利 . 在Oracle数据库和OCI应用程序之间传输数据时,OCI可以执行各种数据类型转换 . OCI外部数据类型多于Oracle内部数据类型 .
VARCHAR2
数据类型是可变长度的字符串,最大长度为4000字节 . 如果init.ora参数max_string_size是default,则VARCHAR2
的最大长度可以是4000字节 . 如果init.ora参数max_string_size = extended,VARCHAR2
的最大长度可以是32767字节VARCHAR
数据类型存储不同长度的字符串 . 前2个字节包含字符串的长度,其余字节包含字符串 . bind或define调用中指定的字符串长度必须包含两个长度字节,因此可以接收或发送的最大VARCHAR
字符串长度为65533字节,而不是65535 .在12.2数据库中进行的快速测试表明,作为内部数据类型,Oracle仍将
VARCHAR
视为VARCHAR2
的假型 . 它不是SYNONYM
,它是Oracle中的实际对象类型 .VARCHAR
对ProC / C预编译器选项也有一些含义 . 对于感兴趣的程序员,链接位于:Pro*C/C++ Programmer's Guide经过一些实验(见下文),我可以确认,截至2017年9月,the accepted answer中描述的功能没有任何变化: -
Rextester demo for Oracle 11g:为
VARCHAR
和VARCHAR2
插入空字符串NULL
.LiveSQL demo for Oracle 12c:相同的结果 .
这两个关键字的历史原因在an answer to a different question中得到了很好的解释 .
目前,他们是一样的 . 但以前
VARCHAR
由Oracle保留,以支持将来NULL
和空字符串之间的区别,正如ANSI标准规定的那样 .VARCHAR2
不区分NULL
和空字符串,永远不会 .Emp_name varchar(10)
- 如果输入小于10位的值,则无法删除剩余空间 . 它总共使用了10个空格 .Emp_name varchar2(10)
- 如果输入小于10位的值,则会自动删除剩余空间VARCHAR2
用于存储可变长度的字符串 . 字符串值的长度将以值本身存储在磁盘上 .
VARCHAR
行为与VARCHAR2完全相同 . 但是,不应使用此类型,因为它保留供将来使用
VARCHAR最多可存储2000个字节的字符,而VARCHAR2最多可存储4000个字节的字符 .
如果我们将数据类型声明为VARCHAR,那么它将为NULL值占用空间 . 在VARCHAR2数据类型的情况下,它不会占用NULL值的任何空间 . 例如 . ,
name varchar(10)
即使名称是'Ravi__',也将保留6个字节的内存,而
将根据输入字符串的长度保留空间 . 例如,'Ravi__'的4字节内存 .
这里,_表示NULL .
注意:varchar将为空值保留空间,varchar2不会为空值保留任何空间 .
Difference:
VARCHAR
最多可存储2000个字节的字符,而VARCHAR2
最多可存储4000个字节的字符 .如果我们将数据类型声明为
VARCHAR
,则它将占用NULL
值的空间,如果是VARCHAR2
数据类型,它将不占用任何空间 .Similarity:
VARCHAR
和VARCHAR2
都是变量字符 .source