varchar和varchar2有什么区别?
该博客文章激发了这个问题的机率是多少? joelonsoftware.com/articles/GuerrillaInterviewing3.html
目前,它们是同义词。
根据ANSI标准的规定,Oracle保留VARCHAR,以支持将来区分NULL和空字符串。
VARCHAR2不能区分NULL和空字符串,也永远不会。
如果您依赖空字符串并且NULL是同一件事,则应使用VARCHAR2。
Hadnt以前听过这个理由,那很有用。谢谢。记录下来,Oracle中的主要字符类型是" varchar2"仍然是完全荒谬的。难道不会像可怕的鞭打一样打击其他人吗?似乎我在学习编程的第一周中会如何解决一些问题。
@Ian:主要类型是VARCHAR2,因为当前没有表现得像VARCHAR应该的类型。实际上,在正确实施VARCHAR之前,您根本不应使用。
谢谢,@ Quassnoi。因此,我认为最愚蠢的部分是Oracle没有像其他所有数据库一样具有适当的VARCHAR,然后呢?这里发生了一些愚蠢的事情,我敢肯定... :)
@Ian:在开发Oracle时,没有任何标准。到标准出现时,它已经负担了旧版应用程序的负担。我们都知道它是如何发生的。
@Quassnoi Im正在使用Oracle12c。而且我认为varchar2现在在empty和null之间有所作为,因为我尝试了`where name is null`会得到空结果,但是当我尝试`where name =`时却什么也没显示。
这似乎不是真的吗?是否有指向某些Oracle文档的链接来确认这一点?
@mk:对我来说似乎很真实。肯定应该有某种文件或某种东西。
@Quassnoi好吧,我同意这看起来很合理,但这还不够好吗?
@mk:足够干什么? (而且,出于好奇,为什么要在肯定声明中添加问号?)
哦,等等,您不要声称存在差异,您声称将来可能存在差异。没关系。
@mk:他们要求保护,我只是在他们之后重复
@quassnoi,那是不正确的。 Oracle 12c不能区分null和。问题是where name=等效于where name = NULL,并且=运算符对于null始终为false,因此对于也始终为false。
@dan到底是什么不正确?
抱歉,实际上是@UnKnown,他写了我正在回复的错误评论。 where x is NULL与where x =返回不同结果的事实并不意味着null和有任何不同。不同的行为归因于=运算符。
我看不到单独的数据类型足以支持ANSI行为。仍然需要其他数据库/会话级别配置来描述字符串文字应如何表现,即应被视为VARCHAR2或VARCHAR。如果您有数据库配置,那么单独的数据类型有什么用?您可以从列中推断文字数据类型,它将以简单的情况存储,但并非总是如此。
这里有一个增强请求来支持oracle中的ANSI行为community.oracle.com/ideas/19866
如ANSI标准所规定,Oracle保留VARCHAR,以支持将来区分NULL和空字符串。 –您能否提供此声明的参考?
@piotrdobrogost:docs.oracle.com/cd/A57673_01/DOC/server/doc/SCN73/ VARCHAR数据类型当前与VARCHAR2数据类型同义。但是,在将来的Oracle版本中,与不同的比较语义相比,VARCHAR数据类型可能存储可变长度的字符串。因此,使用VARCHAR2数据类型存储可变长度的字符串。
谢谢,但是关于NULL和空字符串没有任何内容。
@PiotrDobrogost:抱歉,我想您想要引用"未来"部分。它们是老牌的律师行,所以我认为您无法在实际使用之前找到对它们将要引入的"不同比较语义"的明确引用。但是,可以安全地假设它们至少在一定程度上暗示了标准兼容性,并且这是对所有SQL标准的最主要的违反。
当前,VARCHAR的行为与VARCHAR2完全相同。但是,不应使用类型VARCHAR,因为它保留供将来使用。
来自:CHAR,VARCHAR,VARCHAR2之间的差异
这仍然是正确/正确的答案吗?
不应使用@PhilipRego VARCHAR。我编辑了
取自最新的稳定Oracle生产版本12.2:
资料类型
主要区别在于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 =扩展,则VARCHAR2的最大长度可以为32767字节
VARCHAR数据类型存储不同长度的字符串。前2个字节包含字符串的长度,其余字节包含字符串。绑定或定义调用中字符串的指定长度必须包含两个长度字节,因此可以接收或发送的最大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 ++程序员指南
那么这是否意味着VARCHAR仍然对待== null?
是。上面有关内部类型与外部类型的讨论来自OCI参考。 《 12.2 SQL语言参考》仍然带有与VARCHAR相同的不使用语句。
这就是为什么我讨论OCI差异的原因,否则它几乎保留给将来使用,或者正如他们所说的可变长度,这可能暗示了字符集,例如多字节UTF8。
您已显示声明为VARCHAR的值以VARCHAR2的形式存储在数据库中,但是VARCHAR的最大长度(65533字节)大于VARCHAR2的最大长度(32767字节)。数据库如何处理呢?
IIRC,很久以前(也许是Oracle 6?),有一个VARCHAR类型对空间填充不正确-还是截断了空间? AAR,VARCHAR2是答案。 Oracle一直在说他们将带回VARCHAR,但是,我敢肯定,当空字符串为NOT NULL时,将会咬牙切齿。
经过一些试验(请参阅下文),我可以确认到2017年9月,接受的答案中描述的功能没有任何变化:-
Oracle 11g的Rextester演示:
两个VARCHAR的空字符串都作为NULL插入
和VARCHAR2。
Oracle 12c的LiveSQL演示:结果相同。
这两个关键字的历史原因在一个不同问题的答案中得到了很好的解释。
目前,它们是相同的。但是以前
我在网上某处读到,
Oracle保留VARCHAR,以支持将来按ANSI标准规定在NULL和空字符串之间进行区分。
VARCHAR2不能区分NULL和空字符串,并且永远不会。
也,
Emp_name varchar(10)-如果输入的值小于10位,则剩余空间无法删除。它总共使用了10个空格。
Emp_name varchar2(10)-如果输入的值小于10位,则剩余空间将自动删除
VARCHAR最多可以存储2000个字节的字符,而VARCHAR2最多可以存储4000个字节的字符。
如果我们将数据类型声明为VARCHAR,则它将占用NULL值的空间。对于VARCHAR2数据类型,它将不为NULL值占用任何空间。例如。,
name varchar(10)
即使名称为" Ravi__",也会保留6个字节的内存,而
name varchar2(10)
将根据输入字符串的长度保留空间。例如," Ravi__"的4个字节的内存。
_代表NULL。
注意:varchar将为空值保留空间,而varchar2将不为空值保留任何空间。
我认为此答案使VARCHAR与CHAR混淆。
我现在已经编辑了答案
区别:
VARCHAR最多可以存储2000个字节的字符,而VARCHAR2最多可以存储4000个字节的字符。
如果我们将数据类型声明为VARCHAR,则它将为NULL值占用空间;对于VARCHAR2数据类型,它将不占用任何空间。
相似:
VARCHAR和VARCHAR2都是可变字符。
资源