Oracle中varchar和varchar2有什么区别?
varchar和varchar2有什么区别?
就目前而言,它们是同义词。
按照ANSI
标准规定, VARCHAR
被Oracle
保留以支持将来的NULL
和空string的区分。
VARCHAR2
不区分NULL
和空string,永远不会。
如果你依赖于空string和NULL
是相同的东西,你应该使用VARCHAR2
。
目前VARCHAR的行为与VARCHAR2完全相同。 但是,这种types不应该被使用,因为它被保留以备将来使用。
取自: CHAR,VARCHAR,VARCHAR2之间的区别
取自最新的稳定Oracle产品版本12.2: 数据types
主要区别在于VARCHAR2
是内部数据types , VARCHAR
是外部数据types 。 所以我们需要了解内部和外部数据types之间的区别…
在数据库中,值存储在表中的列中。 在内部,Oracle以特定格式表示数据,称为内部数据types 。
一般来说,OCI(Oracle调用接口)应用程序不适用于数据的内部数据types表示,但适用于由写入语言预定义的主机语言数据types。 在OCI客户端应用程序和数据库表之间传输数据时,OCI库将在内部数据types和外部数据types之间转换数据。
外部types通过使用主机语言types而不是专有数据格式来为程序员提供便利。 在Oracle数据库和OCI应用程序之间传输数据时,OCI可以执行广泛的数据types转换。 Oracle内部数据types有更多的OCI外部数据types。
VARCHAR2
数据types是可变长度的string,最大长度为4000字节。 如果init.ora参数max_string_size是缺省值,那么VARCHAR2
的最大长度可以是4000字节。 如果init.ora参数的max_string_size = extended,那么VARCHAR2
的最大长度可以是32767字节
VARCHAR
数据types存储不同长度的string。 前2个字节包含string的长度,其余字节包含string。 bind或define调用中指定的string长度必须包含两个长度字节,因此可以接收或发送的最大VARCHAR
string长度为65533字节,而不是65535。
对12.2数据库的快速testing表明,作为内部数据types ,Oracle仍将VARCHAR
视为VARCHAR2
。 它不是在Oracle中是实际对象types的SYNONYM
。
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 ++程序员指南
经过一些实验(见下文),我可以确认,截至2017年9月,在接受的答案中描述的function方面没有任何改变: –
- 针对Oracle 11g的Rextester演示:对于
VARCHAR
和VARCHAR2
空string均作为NULL
插入。 - 用于Oracle 12c的LiveSQL演示:结果相同。
这两个关键词的历史原因在一个不同的问题的答案中得到了很好的解释。
VARCHAR2
用于存储可变长度的string。 string值的长度将被存储在具有值本身的磁盘上。
variable x varchar2(10) begin :x := 'hullo'; end; /
VARCHAR
行为与VARCHAR2完全相同。 但是,这种types不应该被使用,因为它被保留以备将来使用
-
VARCHAR最多可以存储2000个字节的字符,而VARCHAR2最多可以存储4000个字节的字符。
-
如果我们将数据types声明为VARCHAR,那么它将占用NULL值的空间。 在VARCHAR2数据types的情况下,它不会占用任何NULL值的空间。 例如,
name varchar(10)
将保留6个字节的内存,即使名称是'Ravi__',而
name varchar2(10)
将根据inputstring的长度来保留空间。 例如“Ravi__”的4个字节的内存。
在这里,_表示NULL。
注意:varchar将为空值保留空间,varchar2不会为空值保留任何空间。