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

时间:2009-07-23 11:40:26

标签: oracle sqldatatypes

varchar和varchar2有什么区别?

7 个答案:

答案 0 :(得分:298)

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

VARCHAR保留{p> Oracle以支持将来NULL和空字符串之间的区别,正如ANSI标准所规定的那样。

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

如果您依赖空字符串且NULL是相同的,则应使用VARCHAR2

答案 1 :(得分:36)

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

取自:Difference Between CHAR, VARCHAR, VARCHAR2

答案 2 :(得分:21)

取自最新稳定的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个字节包含字符串的长度,其余字节包含字符串。 bind或define调用中指定的字符串长度必须包含两个长度字节,因此可以接收或发送的最大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

答案 3 :(得分:2)

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

  1. Rextester demo for Oracle 11g: NULLVARCHAR VARCHAR2插入空字符串 和logging.getLogger(__name__).disabled = True
  2. LiveSQL demo for Oracle 12c:同样的结果。
  3. 这两个关键字的历史原因在an answer to a different question中有详细解释。

答案 4 :(得分:1)

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

  1. 在网上的某个地方,我读到了
Oracle保留

VARCHAR,以支持将来按ANSI标准规定在NULL和空字符串之间进行区分。

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

  1. 也是

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

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

答案 5 :(得分:-1)

差异:

  • VARCHAR可存储最多2000个字节的字符,而VARCHAR2最多可存储4000个字节的字符。
  • 如果我们将数据类型声明为VARCHAR,那么它将占用NULL值的空间,如果是VARCHAR2数据类型,它将不会占用任何空间。

相似:

  • VARCHARVARCHAR2都具有可变性。

source

答案 6 :(得分:-1)

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

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

    name varchar(10)

  3. 将保留6个字节的内存,即使名称为'Ravi__',而

    name varchar2(10) 
    

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

    这里,_代表NULL。

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