首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Varchar2和char的主要区别是什么?

Varchar2和char的主要区别是什么?
EN

Stack Overflow用户
提问于 2013-12-06 06:51:43
回答 7查看 91.6K关注 0票数 27

创建表:

代码语言:javascript
复制
CREATE TABLE test (
charcol    CHAR(10),
varcharcol VARCHAR2(10));

SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;

结果:

代码语言:javascript
复制
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1 

请告诉我Varchar2和char的区别是什么?我们在什么时候同时使用?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-12-06 07:57:00

显示区别的简单示例:

代码语言:javascript
复制
SELECT 
    '"'||CAST('abc' AS VARCHAR2(10))||'"', 
    '"'||CAST('abc' AS CHAR(10))||'"' 
FROM dual;


'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc"                               "abc       "                   
1 row selected.

字符长度总是固定的表达式是有用的,例如美国州的邮政编码,例如CA、NY、FL、TX

票数 22
EN

Stack Overflow用户

发布于 2017-02-10 17:48:42

虽然已经有几个答案正确地描述了char的行为,但我认为需要指出的是,除了在三种特定情况下之外,不应该使用

  1. 您正在构建一个固定长度的文件或报表,并将一个非空值分配给char,从而避免了编写rpad()表达式的需要。例如,如果firstnamelastname都定义为char(20),那么firstname||lastname是编写rpad(firstname,20)||rpad(lastname,20)以创建 Chuck Norris
  2. 您需要区分显式空字符串''null。通常,它们在甲骨文中是一样的,但是将''分配给char值会触发它的空白填充行为,而null不会,所以如果区分区别很重要,而且我真的想不出原因,那么您就有办法做到这一点。
  3. 您的代码是从(或需要兼容)其他系统移植的,这些系统由于遗留原因需要空白填充。在这种情况下,你被困在它和我的同情。

实际上,没有理由仅仅因为某个长度是固定的而使用char (例如,Y/N标志或货币代码,如'USD')。它没有更高的效率,也没有节省空间( varchar2没有神秘的长度指示符,char只有一个空白的填充开销),它也不会阻止任何人输入更短的值。(如果在'ZZ'货币列中输入char(3),它将被存储为'ZZ '。)它甚至与以前依赖它的某个古老版本的甲骨文并不是向后兼容的,因为从来没有。

传染也可能蔓延,就像(遵循最佳实践)一样,您可以使用类似于sales.currency%type的东西来锚定变量声明。现在,您的l_sale_currency变量是一个隐秘的char,它将在较短的值(或'')中得到不可见的空白,从而为那些l_sale_currency不等于l_refund_currency的bug打开了大门,即使您为它们都分配了'ZZ'

一些人认为,char(n) (其中n是某个字符的长度)表示值应该是n个字符长,这是一种自我文档形式。但是如果你是认真对待三字符格式(比如ISO-Alpha-3国家代码而不是ISO-Alpha-2 ),你会不会定义一个约束来强制执行规则,而不是让开发人员看一眼char(3)数据类型并得出自己的结论呢?

CHAR是在Oracle6中引入的,我敢肯定,是因为ANSI兼容的原因。可能有潜在的客户决定购买哪种数据库产品和ANSI兼容性在他们的检查表上(或者以前是那样的),而带有空白填充的CHAR是在ANSI标准中定义的,所以Oracle需要提供它。你不应该实际使用它。

票数 32
EN

Stack Overflow用户

发布于 2017-11-02 10:42:52

只是为了避免混淆很多错误的信息。下面是一些关于差异的信息,包括性能

参考资料:ID:2668391900346844476

因为char只不过是一个空白填充到最大长度的VARCHAR2,也就是说,下面的X列和Y列之间的差异: 创建表t(x varchar2(30),y char(30) ),插入t (x,y)值( rpad( 'a‘,’',30),‘a’); 绝对不算什么,并且考虑到下面X列和Y列之间的区别: 插入t (x,y)值('a','a') X消耗3个字节(空指示符,前导字节长度,1个字节表示'a'),Y消耗32个字节(空指示符,前导字节长度,30个字节表示'a‘)。 嗯,varchar2将在某种程度上“在性能上具有优势”。对我们来说,它帮助的不是所有的char( 30 )总是30个字节--对我们来说,它只是一个空白填充到最大长度的varchar2。它帮助我们处理-零,zilch,zippo。 每当你看到有人说“速度快了50%”,那就是--没有例子,没有科学,没有事实,没有故事来支持--就大声嘲笑他们,继续前进。 该页面上还有其他“虚构的东西”,例如: “在CHAR中,搜索速度更快,因为所有字符串都存储在彼此指定的位置,系统不必搜索字符串的末尾。而在VARCHAR中,系统必须先找到字符串的结尾,然后再进行搜索。”假:字符只是一个varchar2空白填充-我们不存储字符串“在一个指定的位置从对方”。我们搜索字符串的末尾--我们使用一个前导字节长度来解决问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20417845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档