Qua*_*noi 316

至于现在,它们是同义词.

VARCHAR作为标准规定,将来保留Oracle以支持区分NULL和空字符串ANSI.

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

如果你依赖空字符串并且NULL是同一个东西,你应该使用VARCHAR2.

  • 以前没有听说过这个理由,这很有用.谢谢.为了记录,Oracle中的主要字符类型是"varchar2"仍然是完全荒谬的.这不会打击其他任何人作为一个可怕的kludge吗?好像我在学习编程的第一周就解决了一些问题. (36认同)
  • 谢谢,@ Quassnoi.所以我想愚蠢的部分是Oracle没有像其他数据库一样的正确VARCHAR,那么呢?这里有些蠢事,我很确定...... :) (11认同)
  • @Ian:当Oracle开发时,没有标准.当标准出现时,它已经有了遗留应用程序的负担.我们都知道它是如何发生的. (11认同)
  • @Ian:主类型是`VARCHAR2`,因为目前没有类似`VARCHAR`的类型.实际上,在正确实现之前,你根本不应该使用`VARCHAR`. (7认同)
  • 对不起,实际上是@UnKnown写了[我正在回复的错误评论](http://stackoverflow.com/questions/1171196/what-is-the-difference-between-varchar-and-varchar2/1171200?noredirect = 1#comment56070615_1171200)."其中x为NULL"这一事实返回的结果不同于`​​其中x =''`**不**意味着`NULL`和`''`以任何方式不同.不同的行为是由`=`运算符引起的. (4认同)
  • @quassnoi,这是不正确的。Oracle 12c **不区分** `NULL` 和 `''`。问题在于`where name=''` 等价于`where name = NULL`,并且`=` 运算符对于`NULL` 总是* 为假——因此对于`''` 也总是为假。 (2认同)

Bri*_*ian 37

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

取自:CHAR,VARCHAR,VARCHAR2之间的差异

  • 这还是一个准确/正确的答案吗? (2认同)

san*_*man 24

摘自最新稳定的Oracle生产版本12.2: 数据类型

主要区别在于它VARCHAR2内部数据类型并且VARCHAR外部数据类型.所以我们需要了解内部和外部数据类型之间的区别......

在数据库内部,值存储在表的列中.在内部,Oracle以特定格式表示数据,称为内部数据类型.

通常,OCI(Oracle调用接口)应用程序不能与数据的内部数据类型表示一起使用,而是使用由编写它们的语言预定义的宿主语言数据类型.在OCI客户端应用程序和数据库表之间传输数据时,OCI库会在内部数据类型和外部数据类型之间转换数据.

外部类型通过使用主机语言类型而不是专有数据格式,为程序员提供了便利.在Oracle数据库和OCI应用程序之间传输数据时,OCI可以执行各种数据类型转换.OCI外部数据类型多于Oracle内部数据类型.

VARCHAR2数据类型是具有4000个字节的最大长度字符的可变长度的字符串.如果init.ora参数max_string_size是default,则a的最大长度VARCHAR2可以是4000字节.如果init.ora参数max_string_size = extended,则a的最大长度VARCHAR2可以是32767字节

VARCHAR不同长度的数据类型存储字符串.前2个字节包含字符串的长度,其余字节包含字符串.bind或define调用中指定的字符串长度必须包含两个长度字节,因此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)
Run Code Online (Sandbox Code Playgroud)

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

  • 那么这是否意味着 `VARCHAR` 仍然处理 `'' == null` ? (2认同)
  • 是的。上面对内部与外部类型的讨论来自 OCI 参考。[12.2 SQL 语言参考](http://docs.oracle.com/database/122/SQLRF/Data-Types.htm#GUID-DF7E10FC-A461-4325-A295-3FD4D150809E) 仍然带有相同的'不要使用' 声明它一直用于 VARCHAR。 (2认同)