Char
和varchar
是SQL中的数据类型,因为它们在许多其他语言中(所以这个问题可能是多语言的。)
根据我的理解,不同之处在于,如果我将Char
声明为Char(20)
,它将分配20(字节/位)[有人会澄清这一点吗?现在,我将使用字节。然后,如果我只使用16个字节,我仍然会有四个分配给该字段。 (浪费4个字节的内存。)
但是,如果我将varchar
声明为varchar(20)
并且仅使用了16个字节,那么它只会分配16个字节。
当然这更好吗?为什么有人会选择char
?它是遗留的原因,还是我缺少的东西?
答案 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
并非如此。