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


Answers:


336

目前,它们是同义词。

VARCHAR保留,Oracle以支持NULL将来与空字符串之间的区别,这是ANSI标准规定的。

VARCHAR2不区分a NULL和空字符串,也永远不会。

如果您依赖空字符串并且NULL是同一件事,则应使用VARCHAR2


40
以前没有听说过,这很有用。谢谢。记录下来,Oracle中的主要字符类型是“ varchar2”还是很荒谬的。难道不会像可怕的仇恨一样打击其他人吗?好像我在学习编程的第一周中会解决一些问题。
伊恩·瓦利

7
@Ian:主要类型是VARCHAR2因为当前没有表现出VARCHAR应有的类型。实际上,VARCHAR在正确实施之前,您根本不应使用。
Quassnoi

11
谢谢,@ Quassnoi。因此,我认为最愚蠢的部分是Oracle没有像其他所有数据库一样具有适当的VARCHAR,然后呢?这是一件愚蠢的事情,我敢肯定... :)
Ian Varley 2010年

11
@Ian:在开发Oracle时,没有任何标准。到标准出现时,它已经具有了遗留应用程序的负担。我们都知道它是如何发生的。
Quassnoi 2010年

5
抱歉,实际上@UnKnown写下了我正在回复错误评论。这一事实where x is NULL从返回不同的结果,where x = ''不能意味着NULL''以任何方式不同。不同的行为归因于=操作员。
丹·伦斯基


29

取自最新的稳定的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 =扩展,则a的最大长度VARCHAR2可以是32767字节

VARCHAR不同长度的数据类型存储字符串。前两个字节包含字符串的长度,其余字节包含字符串。绑定或定义调用中字符串的指定长度必须包含两个长度字节,因此VARCHAR可以接收或发送的最大字符串长度为65533字节,而不是65535。

在12.2数据库快速测试表明,作为内部数据类型中,Oracle仍然把一个VARCHAR作为VARCHAR2。它不是SYNONYMOracle中的实际对象类型。

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)

VARCHARProC / C ++预编译器选项也有一些含义。对于感兴趣的程序员,链接位于:Pro * C / C ++程序员指南


1
那么这是否VARCHAR仍在对待'' == null

2
是。上面有关内部类型与外部类型的讨论来自OCI参考。在12.2 SQL语言参考仍然带有相同的“不使用”声明它一直有一个VARCHAR。
威廉·罗伯逊

这就是为什么我讨论OCI差异的原因,否则它几乎保留给将来使用,或者因为它们说“可变长度”而已,这可能暗示了字符集,例如多字节UTF8 ...
sandman

1
您显示了声明为VARCHAR的值以VARCHAR2的形式存储在数据库中,但是VARCHAR的最大长度(65533字节)大于VARCHAR2的最大长度(32767字节)。数据库如何处理呢?
Piotr Dobrogost

IIRC,很久以前(也许是Oracle 6?),有一个VARCHAR类型对空间填充不正确-还是截断了空间?AAR,VARCHAR2是答案。Oracle一直在说他们将带回VARCHAR,但是,我敢肯定,当空字符串不是NOT NULL时,会咬牙切齿。
JMD


0
  1. VARCHAR最多可以存储2000个字节的字符,而VARCHAR2最多可以存储4000个字节的字符。

  2. 如果我们将数据类型声明为VARCHAR,则它将占用NULL值的空间。对于VARCHAR2数据类型,它将不为NULL值占用任何空间。例如,

    name varchar(10)

即使名称为“ Ravi__”,也将保留6个字节的内存,而

name varchar2(10) 

将根据输入字符串的长度保留空间。例如,“ Ravi__”的4个字节的内存。

_代表NULL。

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


2
我想这个答案是混淆VARCHAR使用CHAR
乔恩·海勒

0

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

  1. 我在网上某处读到,

VARCHARNULL正如ANSI标准所规定的那样,Oracle保留了Oracle以支持将来区分空字符串。

VARCHAR2不区分a NULL和空字符串,也永远不会。

  1. 也,

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;
Brian Leach

-1

VARCHAR是VARCHAR2的同义词。但是,不应使用VARCHAR,因为Oracle将来可能会更改其语义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.