Varchar2和char之间的主要区别是什么

ram*_*393 21 sql oracle char varchar2

创建表:

CREATE TABLE test (
charcol    CHAR(10),
varcharcol VARCHAR2(10));

SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
Run Code Online (Sandbox Code Playgroud)

结果:

LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1 
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*son 20

这是一个老线程,但它只是谷歌搜索'Oracle char vs varchar2'的顶部,虽然已经有几个答案正确描述了行为char,但我认为需要说你不应该使用它除外在两种特定情况下:

  1. 您正在构建固定长度的文件或报告,并为a分配非null值,从而char避免了对rpad()表达式进行编码的需要.例如,如果firstnamelastname都被定义为char(20),那么firstname || lastname是一种较短的写作方式rpad(firstname,20) || rpad(lastname,20).
  2. 您需要区分显式空字符串''null.通常它们在Oracle中是相同的,但是分配''给一个char值会触发它的空白填充行为,而null不是,所以如果说出差异是很重要的,我真的不能想到它会出现原因的原因,那么你有办法做到这一点.

实际上没有理由char使用一些长度是固定的(例如Y/N标志或ISO货币代码等'USD').它不是更高效,它不节省空间(没有神秘的长度指示器varchar2,只有一个空白的填充开销char),并且它不会阻止任何人输入更短的值.(如果你输入'ZZ'你的char(3)货币栏,它就会被存储为'ZZ '.)它甚至不能与曾经依赖它的某些古老版本的Oracle向后兼容,因为它从来没有.

传染病可以传播,因为(按照最佳实践),您可以使用类似的东西锚定变量声明sales.currency%type.现在你的l_sale_currency变量是一个秘密char,它会为更短的值(或'')进行无形填空,即使你已经分配给它们两个,也会打开隐藏在l_sale_currency不相等的错误的大门.l_refund_currency'ZZ'

CHAR我确信,在Oracle 6中引入了ANSI兼容性原因.可能有潜在的客户决定购买哪个数据库产品,并且ANSI兼容性在他们的核对表上(或者当时是在那时),并且CHAR在ANSI标准中定义了空白填充,因此Oracle需要提供它.你不应该真正使用它.

  • 这应该是最重要的答案 - 特别是对于"你不应该真正使用它"! (4认同)
  • +1 因为您的解释与 Tom Kyte 在 asktom.oracle.com 上的几个帖子相符:[Char Vs Varchar](https://asktom.oracle.com/pls/asktom/f?p=100:11:0: :::P11_QUESTION_ID:2668391900346844476) 和 [我应该使用 char 还是 varchar2](https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1232612348) (3认同)

Wer*_*eit 19

显示差异的简单示例:

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.
Run Code Online (Sandbox Code Playgroud)

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

  • CHAR 从来都不是真正“有用”的:美国州代码的存储效率与 VARCHAR2 一样。 (2认同)

And*_*ddo 5

只是为了避免混淆很多错误的信息。以下是有关差异(包括性能)的一些信息

参考:https : //asktom.oracle.com/pls/asktom/f?p=100 :11:0 :::: P11_QUESTION_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个字节(空指示符,前导字节长度,'a'为1个字节),Y消耗32个字节(空指示符,前导字节长度,为'a'30个字节)

嗯,varchar2将在某种程度上“处于性能优势”。它根本不能帮助char(30)始终为30个字节-对我们来说,它只是一个varchar2,空白填充为最大长度。它可以帮助我们进行加工-零,zilch,zippo。

每当您看到有人说“速度提高50%”时,就是这样-没有例子,没有科学,没有事实,没有故事来支持它-只是大声地嘲笑他们并继续前进。

该页面上还有其他“虚构的东西”,例如:

“在CHAR中搜索速度更快,因为所有字符串彼此都存储在 指定位置,系统不必 搜索字符串的结尾。而在VARCHAR中,系统必须 先找到字符串的结尾,然后再查找搜索。”

否:一个char只是一个varchar2空白填充-我们不会“在彼此之间的指定位置”存储字符串。我们确实搜索字符串的结尾-我们使用前导字节长度来找出问题。