【发布时间】:2010-11-13 08:38:27
【问题描述】:
varchar 和 varchar2 有什么区别?
【问题讨论】:
-
这个问题受到这篇博文启发的可能性有多大? joelonsoftware.com/articles/GuerrillaInterviewing3.html
标签: oracle sqldatatypes
varchar 和 varchar2 有什么区别?
【问题讨论】:
标签: oracle sqldatatypes
目前 VARCHAR 的行为与 VARCHAR2 完全相同。但是,不应使用 VARCHAR 类型,因为它是为将来使用而保留的。
【讨论】:
VARCHAR 不应使用。我编辑了它
目前,它们是相同的。但以前
VARCHAR 由 Oracle 保留,以支持将来区分 NULL 和空字符串,正如 ANSI 标准规定的那样。
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;
经过一些实验(见下文),我可以确认,截至 2017 年 9 月,the accepted answer:-
中描述的功能没有任何变化VARCHAR,空字符串插入为NULLs
和VARCHAR2。an answer to a different question 很好地解释了这两个关键字的历史原因。
【讨论】:
取自最新稳定的 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)
VARCHAR 还对 ProC/C++ 预编译器选项有一些影响。有兴趣的程序员,链接在:Pro*C/C++ Programmer's Guide
【讨论】:
VARCHAR 仍然对待'' == null?
VARCHAR 最多可存储 2000 个字节的字符,而 VARCHAR2 最多可存储 4000 个字节的字符。
如果我们将数据类型声明为 VARCHAR,那么它将占用 NULL 值的空间。在 VARCHAR2 数据类型的情况下,它不会为 NULL 值占用任何空间。例如,
name varchar(10)
即使名字是 'Ravi__' 也会保留 6 字节的内存,而
name varchar2(10)
会根据输入字符串的长度预留空间。例如,“Ravi__”的 4 字节内存。
这里,_代表NULL。
注意:varchar 将为空值保留空间,而 varchar2 不会为空值保留任何空间。
【讨论】:
VARCHAR 和CHAR。
就目前而言,它们是同义词。
VARCHAR 由Oracle 保留,以支持将来区分NULL 和空字符串,正如ANSI 标准规定的那样。
VARCHAR2 不区分 NULL 和空字符串,而且永远不会。
如果你依赖空字符串和NULL 是同一个东西,你应该使用VARCHAR2。
【讨论】:
VARCHAR2,因为目前没有像VARCHAR 那样行为的类型。事实上,在正确实施之前,您根本不应该使用VARCHAR。
where x is NULL 从where x = '' 返回不同结果的事实确实不意味着NULL 和'' 在任何方面都不同。不同的行为是由于 = 运算符。