ChatGPT解决这个技术问题 Extra ChatGPT

Oracle中的varchar和varchar2有什么区别?

varchar 和 varchar2 有什么区别?

这个问题受到这篇博文启发的可能性有多大? joelonsoftware.com/articles/GuerrillaInterviewing3.html

M
MK.

就目前而言,它们是同义词。

VARCHAROracle 保留,以支持将来区分 NULL 和空字符串,如 ANSI 标准规定的那样。

VARCHAR2 不区分 NULL 和空字符串,而且永远不会。

如果您依赖空字符串和 NULL 是同一个东西,您应该使用 VARCHAR2


以前没听过这个理由,这很有用。谢谢。作为记录,Oracle中的主要字符类型是“varchar2”仍然是完全可笑的。这不会让其他人觉得这是一个可怕的杂物吗?似乎我在学习编程的第一周就解决了一些问题。
@Ian:主要类型是 VARCHAR2 因为目前没有像 VARCHAR 那样行为的类型。事实上,在正确实施之前,您根本不应该使用 VARCHAR
谢谢,@Quassnoi。所以我想愚蠢的部分是Oracle没有像其他所有数据库一样的适当的VARCHAR,那么呢?这里发生了一些愚蠢的事情,我敢肯定...... :)
@Ian:在开发 Oracle 时,没有标准。到标准出现时,它已经背负了遗留应用程序的负担。我们都知道它是如何发生的。
抱歉,实际上是 @UnKnown 编写了 incorrect comment I was responding towhere x is NULL 返回与 where x = '' 不同的结果这一事实意味着 NULL'' 在任何方面都不同。不同的行为归因于 = 运算符。
b
bugybunny

目前 VARCHAR 的行为与 VARCHAR2 完全相同。但是,不应使用类型 VARCHAR,因为它是为将来使用而保留的。

取自:Difference Between CHAR, VARCHAR, VARCHAR2


@PhilipRego VARCHAR 不应使用。我编辑了
s
sandman

取自最新的稳定 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
是的。上面关于内部与外部类型的讨论来自 OCI 参考。 12.2 SQL Language Reference 仍然带有与 VARCHAR 相同的“请勿使用”语句。
这就是我讨论 OCI 差异的原因,否则它几乎是为将来使用而保留的,或者正如他们所说的“可变长度”,这可能暗示着诸如多字节 UTF8 之类的字符集......
您展示了声明为 VARCHAR 的值作为 VARCHAR2 存储在数据库中,但是 VARCHAR 的最大长度(65533 字节)大于 VARCHAR2 的最大长度(32767 字节)。数据库如何处理这个?
IIRC,很久以前(也许是 Oracle 6?)有一种 VARCHAR 类型对空间填充行为不端 - 或者它是否截断了空格? AAR,VARCHAR2 就是答案。 Oracle 一直在说他们会带回 VARCHAR,但我敢肯定,当空字符串不为空时,他们会咬牙切齿。
S
Steve Chambers

经过一些实验(见下文),我可以确认,截至 2017 年 9 月,the accepted answer 中描述的功能没有任何变化:-

Oracle 11g 的 Rextester 演示:空字符串作为 NULL 插入 VARCHAR 和 VARCHAR2。 Oracle 12c 的 LiveSQL 演示:结果相同。

这两个关键字的历史原因在 an answer to a different question 中有很好的解释。


P
Palak Jain

VARCHAR 最多可以存储 2000 个字节的字符,而 VARCHAR2 最多可以存储 4000 个字节的字符。如果我们将数据类型声明为 VARCHAR,那么它将占用 NULL 值的空间。对于 VARCHAR2 数据类型,它不会为 NULL 值占用任何空间。例如,名称 varchar(10)

即使名称是 'Ravi__' 也会保留 6 个字节的内存,而

name varchar2(10) 

将根据输入字符串的长度预留空间。例如,'Ravi__' 的 4 字节内存。

这里,_ 代表 NULL。

注意: varchar 将为空值保留空间,而 varchar2 不会为空值保留任何空间。


我认为这个答案将 VARCHARCHAR 混淆了。
t
taras

目前,它们是相同的。但以前

在网上某处,我读到,

按照 ANSI 标准的规定,Oracle 保留 VARCHAR 以支持将来区分 NULL 和空字符串。

VARCHAR2 不区分 NULL 和空字符串,而且永远不会。

还,

Emp_name varchar(10) - 如果您输入的值小于 10 位,则无法删除剩余空间。它总共使用了 10 个空格。

Emp_name varchar2(10) - 如果您输入的值小于 10 位,则剩余空间会被自动删除


我最近偶然发现了这篇文章,请注意它是不正确的。执行以下操作,两个字段都将是 3 个字符: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;
@BrianLeach:是的,它们目前的行为相同,但甲骨文将来会改变一些东西,使其表现得像标准所说的那样。