varchar 和 varchar2 有什么区别?
6 回答
就目前而言,它们是同义词。
VARCHAR
按照标准的规定,被保留Oracle
以支持将来区分NULL
和空字符串。ANSI
VARCHAR2
不区分NULL
空字符串和空字符串,永远不会。
如果你依赖空字符串并且NULL
是相同的东西,你应该使用VARCHAR2
.
目前 VARCHAR 的行为与 VARCHAR2 完全相同。但是,VARCHAR
不应使用该类型,因为它是为将来使用而保留的。
取自最新稳定的 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=extended,则a的最大长度VARCHAR2
可以是32767字节
数据类型存储不同长度的VARCHAR
字符串。前 2 个字节包含字符串的长度,其余字节包含字符串。绑定或定义调用中字符串的指定长度必须包括两个长度字节,因此VARCHAR
可以接收或发送的最大字符串是 65533 字节长,而不是 65535。
在 12.2 数据库中进行的快速测试表明,作为内部数据类型,Oracle 仍将aVARCHAR
视为. 它不是Oracle 中的实际对象类型。VARCHAR2
SYNONYM
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)
ProC/C++ 预编译器选项也有一些含义VARCHAR
。有兴趣的程序员,链接在:Pro*C/C++ Programmer's Guide
经过一些实验(见下文),我可以确认,截至 2017 年 9 月,接受的答案中描述的功能没有任何变化:-
- Oracle 11g 的 Rextester 演示:
空字符串作为
NULL
sVARCHAR
和VARCHAR2
。 - Oracle 12c 的 LiveSQL 演示:结果相同。
这两个关键字的历史原因在另一个问题的答案中得到了很好的解释。
VARCHAR 最多可以存储 2000 个字节的字符,而 VARCHAR2 最多可以存储 4000 个字节的字符。
如果我们将数据类型声明为 VARCHAR,那么它将占用 NULL 值的空间。对于 VARCHAR2 数据类型,它不会为 NULL 值占用任何空间。例如,
name varchar(10)
即使名称是 'Ravi__' 也会保留 6 个字节的内存,而
name varchar2(10)
将根据输入字符串的长度预留空间。例如,'Ravi__' 的 4 字节内存。
这里,_ 代表 NULL。
注意: varchar 将为空值保留空间,而 varchar2 不会为空值保留任何空间。
目前,它们是相同的。但以前
- 在网上某处,我读到,
VARCHAR
按照 ANSI 标准的规定,Oracle 保留它以支持将来区分NULL
和空字符串。
VARCHAR2
不区分NULL
空字符串和空字符串,永远不会。
- 还,
Emp_name varchar(10)
- 如果您输入的值小于 10 位,则无法删除剩余空间。它总共使用了 10 个空格。
Emp_name varchar2(10)
- 如果您输入的值小于 10 位,则剩余空间将自动删除