为什么我应该使用char而不是varchar?

时间:2014-10-25 20:09:18

标签: sql sql-server database-design char varchar

Charvarchar是SQL中的数据类型,因为它们在许多其他语言中(所以这个问题可能是多语言的。)

根据我的理解,不同之处在于,如果我将Char声明为Char(20),它将分配20(字节/位)[有人会澄清这一点吗?现在,我将使用字节。然后,如果我只使用16个字节,我仍然会有四个分配给该字段。 (浪费4个字节的内存。)

但是,如果我将varchar声明为varchar(20)并且仅使用了16个字节,那么它只会分配16个字节。

当然这更好吗?为什么有人会选择char?它是遗留的原因,还是我缺少的东西?

2 个答案:

答案 0 :(得分:8)

首选VARCHAR。

在紧张存储的旧时代,它对空间至关重要。如今,磁盘存储很便宜,但RAM和IO仍然很珍贵。 VARCHAR是IO和缓存友好的;它允许您使用数据更密集地打包db缓冲区缓存,而不是浪费文字"空间"空间,并且出于同样的原因,空间填充会产生IO开销。

CHAR()的优势在于经常更新的记录减少了行链接。更新字段并且值大于先前分配的值时,记录可能会链接。然而,这是可以管理的;数据库通常支持免费百分比"设置表存储属性,告诉DB每行预分配多少额外空间用于增长。

VARCHAR几乎总是优选的,因为空间填充要求您了解它并以不同的方式编码。不同的数据库处理不同。使用VARCHAR,您知道您的字段仅包含您存储在其中的字段。

我还没有用CHAR设计过十多年的架构。

答案 1 :(得分:1)

FROM Specification

  

的char [(N)]

     

长度为n字节的固定长度非Unicode字符数据。必须   是1到8,000之间的值。存储大小为n个字节。 SQL-92   char的同义词是character。

因此Char(20)将分配固定的20字节空间来保存数据。

用法:

例如,如果您有一个名为Gender的列,并且您希望为女性分配仅限M男性(OR)F的值,则您确定该字段/列是非空列。在这种情况下,将其定义为CHAR(1)而不是像

更好
Gender CHAR(1) not null

此外,varchar类型会带来2 bytes的额外开销,如文档中所述。存储大小是输入数据的实际长度+ 2个字节。

如果char并非如此。