varchar 和 varchar2 有什么区别?
就目前而言,它们是同义词。
VARCHAR
由 Oracle
保留,以支持将来区分 NULL
和空字符串,如 ANSI
标准规定的那样。
VARCHAR2
不区分 NULL
和空字符串,而且永远不会。
如果您依赖空字符串和 NULL
是同一个东西,您应该使用 VARCHAR2
。
目前 VARCHAR 的行为与 VARCHAR2 完全相同。但是,不应使用类型 VARCHAR
,因为它是为将来使用而保留的。
取自:Difference Between CHAR, VARCHAR, VARCHAR2
VARCHAR
不应使用。我编辑了
取自最新的稳定 Oracle 生产版本 12.2:Data Types
主要区别在于 VARCHAR2
是一种内部数据类型,而 VARCHAR
是一种外部数据类型。所以我们需要了解内部和外部数据类型之间的区别......
在数据库内部,值存储在表的列中。在内部,Oracle 以称为内部数据类型的特定格式表示数据。
通常,OCI(Oracle 调用接口)应用程序不使用数据的内部数据类型表示,而是使用由编写它们的语言预定义的宿主语言数据类型。当数据在 OCI 客户端应用程序和数据库表之间传输时,OCI 库会在内部数据类型和外部数据类型之间转换数据。
外部类型通过使用宿主语言类型而不是专有数据格式为程序员提供了便利。在 Oracle 数据库和 OCI 应用程序之间传输数据时,OCI 可以执行广泛的数据类型转换。 OCI 外部数据类型比 Oracle 内部数据类型多。
VARCHAR2
数据类型是最大长度为 4000 字节的可变长度字符串。如果 init.ora 参数 max_string_size 为默认值,则 VARCHAR2
的最大长度可以为 4000 字节。如果 init.ora 参数 max_string_size = extended,则 VARCHAR2
的最大长度可以是 32767 字节
VARCHAR
数据类型存储不同长度的字符串。前 2 个字节包含字符串的长度,其余字节包含字符串。绑定或定义调用中字符串的指定长度必须包含两个长度字节,因此可以接收或发送的最大 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)
对于 ProC/C++ 预编译器选项,VARCHAR
也有一些含义。有兴趣的程序员,链接在:Pro*C/C++ Programmer's Guide
VARCHAR
仍会处理 '' == null
?
经过一些实验(见下文),我可以确认,截至 2017 年 9 月,the accepted answer 中描述的功能没有任何变化:-
Oracle 11g 的 Rextester 演示:空字符串作为 NULL 插入 VARCHAR 和 VARCHAR2。 Oracle 12c 的 LiveSQL 演示:结果相同。
这两个关键字的历史原因在 an answer to a different question 中有很好的解释。
VARCHAR 最多可以存储 2000 个字节的字符,而 VARCHAR2 最多可以存储 4000 个字节的字符。如果我们将数据类型声明为 VARCHAR,那么它将占用 NULL 值的空间。对于 VARCHAR2 数据类型,它不会为 NULL 值占用任何空间。例如,名称 varchar(10)
即使名称是 'Ravi__' 也会保留 6 个字节的内存,而
name varchar2(10)
将根据输入字符串的长度预留空间。例如,'Ravi__' 的 4 字节内存。
这里,_ 代表 NULL。
注意: varchar 将为空值保留空间,而 varchar2 不会为空值保留任何空间。
VARCHAR
与 CHAR
混淆了。
目前,它们是相同的。但以前
在网上某处,我读到,
按照 ANSI 标准的规定,Oracle 保留 VARCHAR
以支持将来区分 NULL
和空字符串。
VARCHAR2
不区分 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;
VARCHAR2
因为目前没有像VARCHAR
那样行为的类型。事实上,在正确实施之前,您根本不应该使用VARCHAR
。where x is NULL
返回与where x = ''
不同的结果这一事实不意味着NULL
和''
在任何方面都不同。不同的行为归因于=
运算符。