首页 文章

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

提问于
浏览
18

Creating Table:

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

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

Result:

LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1

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

6 回答

  • 4

    显示差异的简单示例:

    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.
    

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

  • 17

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

    • 您正在构建固定长度的文件或报告,并为 char 分配非空值,从而避免了编写 rpad() 表达式的需要 . 例如,如果 firstnamelastname 都定义为 char(20) ,则 firstname || lastname 是写入 rpad(firstname,20) || rpad(lastname,20) 的较短方式 .

    • 您需要区分显式空字符串 ''null . 通常它们在Oracle中是相同的,但将 '' 分配给 char 值将触发其空白填充行为,而 null 则不会,所以如果它真的想到它之所以存在的原因,那么你有办法做那 .

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

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

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

  • 18

    CHAR 类型具有固定大小,因此如果你说它是10个字节,那么它总是在数据库中存储10个字节,无论你是存储任何文本还是只是空10个字节都无关紧要

    VARCHAR2 size取决于您实际要在数据库中存储的字节数 . 您指定的数字只是可以存储的最大字节数(尽管最少1个字节)

    在处理固定长度的字符串时你应该使用CHAR(你事先知道你将要存储的字符串的确切长度) - 然后数据库可以更好更快地操作它,因为它知道确切的长度

    当您不知道存储字符串的确切长度时,应该使用VARCHAR2 .

    您将使用两者的情况可能是:

    name VARCHAR2(255),
    zip_code CHAR(5) --if your users have only 5 place zip codes
    
  • 0

    只是为了避免混淆错误的信息 . 以下是有关差异的一些信息,包括性能

    参考:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476

    因为char只是一个空白填充到最大长度的VARCHAR2 - 即下面的列X和Y之间的差异:create table 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个字节(空指示符,前导字节长度,'a'为30个字节)Umm,varchar2将在某种程度上“在性能上有利” . 它帮助我们不是所有char(30)总是30个字节 - 对我们来说,它只是一个空白填充到最大长度的varchar2 . 它帮助我们处理 - ZERO,zilch,zippo . 任何时候你看到有人说“它的速度提高了50%”,就是这样 - 没有例子,没有科学,没有事实,也没有任何故事要支持它 - 只要大声笑出来他们继续前进 . 在该页面上还有其他“组成的东西”,例如:“在CHAR中搜索速度更快,因为所有字符串都存储在彼此指定的位置,系统不必搜索字符串的结尾 . 在VARCHAR中,系统必须首先找到字符串的结尾然后去搜索 . “ FALSE:char只是一个varchar2空白填充 - 我们不会将字符串“存储在彼此指定的位置” . 我们搜索字符串的结尾 - 我们使用前导字节长度来解决问题 .

  • 3

    CHAR

    CHAR应该用于存储修复长度字符串 . 在存储在磁盘上之前,字符串值将为空格/空白填充 . 如果此类型用于存储varibale长度字符串,则会浪费大量磁盘空间 .

    VARCHAR2

    VARCHAR2用于存储可变长度的字符串 . 字符串值的长度将以值本身存储在磁盘上 .

    And

    At what times we use both?
    

    这完全取决于您的要求 .

  • 2

    CHAR 用于存储修复长度字符串 . 如果此类型用于存储varibale长度字符串,则会浪费大量磁盘空间 .

    VARCHAR2 用于存储可变长度的字符串 .

    我们两次同时使用?

    这可能会有所不同,取决于您的要求 .

    EDIT:-

    让我们通过一个例子理解这一点,如果你有一个大小为10的学生姓名栏; sname CHAR(10) 并且如果插入了列值 'RAMA'6 empty spaces 将插入值的右侧 . 如果这是VARCHAR列; sname VARCHAR2(10). 然后Varchar将从10个中取出4个空格,然后释放下6个用于其他用途 .

相关问题