首页 文章

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

提问于
浏览
204

varchar和varchar2有什么区别?

8 回答

  • 1

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

    VARCHAROracle 保留,以支持将来 NULL 和空字符串之间的区别,如 ANSI 标准规定 .

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

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

  • 34

    Currently VARCHAR behaves exactly the same as VARCHAR2. However, this type should not be used as it is reserved for future usage.

    取自:Difference Between CHAR, VARCHAR, VARCHAR2

  • -1

    取自最新稳定的Oracle 生产环境 版本12.2:Data Types

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

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

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

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

    VARCHAR2 数据类型是可变长度的字符串,最大长度为4000字节 . 如果init.ora参数max_string_size是default,则 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

  • 0

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

    这两个关键字的历史原因在an answer to a different question中得到了很好的解释 .

  • 1

    目前,他们是一样的 . 但以前

    • 在网上的某个地方,我读到了,

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

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

    • 另外,

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

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

  • 275

    VARCHAR2

    用于存储可变长度的字符串 . 字符串值的长度将以值本身存储在磁盘上 .

    variable x varchar2(10)
    begin
     :x := 'hullo';
    end;
    /
    

    VARCHAR

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

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

    • 如果我们将数据类型声明为VARCHAR,那么它将为NULL值占用空间 . 在VARCHAR2数据类型的情况下,它不会占用NULL值的任何空间 . 例如 . ,

    name varchar(10)

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

    name varchar2(10)
    

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

    这里,_表示NULL .

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

  • -1

    Difference:

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

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

    Similarity:

    • VARCHARVARCHAR2 都是变量字符 .

    source

相关问题