varchar和varchar2的区别是什么?
就目前而言,它们是同义词。
VARCHAR由Oracle保留,以支持将来区分NULL和空字符串,正如ANSI标准所规定的那样。
VARCHAR2不会区分NULL和空字符串,而且永远不会。
如果你依赖空字符串和NULL是一样的东西,你应该使用VARCHAR2。
目前VARCHAR的行为与VARCHAR2完全相同。但是,不应该使用VARCHAR类型,因为它是为将来使用而保留的。
取自:不同点CHAR, VARCHAR, VARCHAR2
VARCHAR最多可以存储2000字节的字符,而VARCHAR2最多可以存储4000字节的字符。 如果我们将数据类型声明为VARCHAR,那么它将占用NULL值的空间。在VARCHAR2数据类型的情况下,它不会为NULL值占用任何空间。例如, 名字varchar (10)
将保留6个字节的内存,即使名称是'Ravi__',而
name varchar2(10)
将根据输入字符串的长度预留空间。例如,“Ravi__”的4字节内存。
这里,_表示NULL。
注意:varchar将为空值保留空间,而varchar2将不为空值保留任何空间。
摘自Oracle最新稳定版本12.2: 数据类型
主要区别在于VARCHAR2是内部数据类型,而VARCHAR是外部数据类型。因此,我们需要了解内部数据类型和外部数据类型之间的区别……
在数据库中,值存储在表的列中。在内部,Oracle以特定的格式表示数据,称为内部数据类型。
一般来说,OCI (Oracle Call Interface)应用程序不使用数据的内部数据类型表示,而是使用由编写它们的语言预先定义的主机语言数据类型。当数据在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个字节包含字符串的长度,其余字节包含字符串。绑定或定义调用中指定的字符串长度必须包括这两个长度字节,因此可以接收或发送的最大VARCHAR字符串长度是65533字节,而不是65535字节。
在12.2数据库中进行的快速测试表明,作为内部数据类型,Oracle仍然将VARCHAR视为VARCHAR2的伪类型。它不是一个同义词,这是一个实际的对象类型在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++程序员指南
经过一些实验(见下文),我可以确认,截至2017年9月,关于公认答案中描述的功能,没有任何变化:-
Rextester演示Oracle 11g: 对于两个VARCHAR,空字符串都作为null插入 和VARCHAR2。 Oracle 12c的LiveSQL演示:同样的结果。
这两个关键词的历史原因在另一个问题的答案中得到了很好的解释。
目前,它们是一样的。但以前
我在网上看到,
VARCHAR由Oracle保留,以支持将来区分NULL和空字符串,正如ANSI标准所规定的那样。
VARCHAR2不会区分NULL和空字符串,而且永远不会。
同时,
Emp_name varchar(10) -如果输入的值小于10位,则无法删除剩余空间。它总共使用了10个空格。
Emp_name varchar2(10) -如果输入的值小于10位数字,则自动删除剩余空间
推荐文章
- Oracle中的双表是什么?
- Oracle中不区分大小写的搜索
- 如何在Oracle SQL开发者中导出查询结果到csv ?
- Oracle SQL Developer多表视图
- 如何在Oracle中做top 1 ?
- Oracle Partition By关键字
- 如何使用服务名而不是SID连接到Oracle
- 从多个表中选择count(*)
- 内部连接vs Where
- 我如何列出一个表中的所有列?
- 如何在不复制数据的情况下创建Oracle表的副本?
- Oracle中的varchar和varchar2有什么区别?
- SQL Server文本类型vs. varchar数据类型
- 如何在Oracle中查找表中的重复值?
- Oracle SQL:用另一个表的数据更新一个表