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

时间:2013-12-06 06:51:43

标签: sql oracle char varchar2

创建表格

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

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

结果:

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

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

7 个答案:

答案 0 :(得分: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.

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

答案 1 :(得分:18)

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

  1. 您正在构建固定长度的文件或报告,并为char分配非空值,从而无需编写rpad()表达式代码。例如,如果firstnamelastname都定义为char(20),则firstname || lastname是编写rpad(firstname,20) || rpad(lastname,20)的较短方式。
  2. 您需要区分显式空字符串''null。通常它们在Oracle中是相同的,但是将''分配给char值将触发其空白填充行为,而null则不会,因此如果区分它是很重要的,那么我真的无法想出它会出现的原因,那么你有办法做到这一点。
  3. 确实没有理由使用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中引入了

    CHAR,我确信,ANSI兼容性原因。可能有潜在的客户决定购买哪个数据库产品并且 ANSI兼容性在他们的核对清单上(或者曾经是当时),并且ANSI标准中定义了带有空白填充的[HttpPost] public async Task<IActionResult> UploadFile(ICollection<IFormFile> files) { var uploads = Path.Combine(_environment.WebRootPath, "uploads"); foreach (var file in files) { if (file.Length > 0) { fileName = Path.GetFileName(file.FileName); using (var fileStream = new FileStream(Path.Combine(uploads, fileName), FileMode.Create)) { await file.CopyToAsync(fileStream); } } } ProcessFile(); return View("NewProject"); } private void ProcessFile() { //Do WORK } ,所以Oracle需要提供它。你不应该真正使用它。

答案 2 :(得分:4)

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

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

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

如果您不知道存储字符串的确切长度,则应使用VARCHAR2。

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

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

答案 3 :(得分:3)

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

参考: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个字节(空指示符,前导字节长度,1   “a”的字节,Y消耗32个字节(空指示符,前导字节   长度,'a'为30个字节)

     

嗯,varchar2会有点“处于优势表现   明智的“。它不会帮助我们所有的char(30)总是30个字节 - 来   我们,它只是一个空白填充到最大的varchar2   长度。它帮助我们处理 - ZERO,zilch,zippo。

     

任何时候你看到有人说“它的速度提高了50%”,就是这样 -   没有例子,没有科学,没有事实,没有故事支持它 - 只是笑   大声对他们说话,继续前进。

     

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

     
    

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

  
     

FALSE:char只是一个varchar2空白填充 - 我们不存储   字符串“在彼此指定的位置”。我们搜索   字符串的结尾 - 我们使用前导字节长度来计算事物   进行。

答案 4 :(得分:2)

<强> CHAR

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

<强> VARCHAR2

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

At what times we use both?

这一切都取决于你的要求。

答案 5 :(得分:1)

当存储在数据库中时,varchar2仅使用分配的空间。例如。如果您有一个varchar2(1999)并在表中放入50个字节,它将使用52个字节。

但是,当存储在数据库中时,char始终使用最大长度,并用空白填充。例如。如果您有char(1999)并在表中放入50个字节,则将消耗2000个字节。

答案 6 :(得分:0)

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

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

  

我们在什么时候同时使用它们?

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

修改: -

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