VARCHAR和CHAR有什么区别?

443

VARCHAR和CHAR在MySQL中有什么区别?

我正在尝试存储MD5哈希值。


17
MD5哈希始终为32个字符。因此,为了最大化性能,请使用CHAR(32),因为CHAR是固定长度的(有关CHAR和VARCHAR之间差异的更多细节,请参见以下答案)。 - Augustin
MySQL文档:CHAR和VARCHAR类型 - rinogo
17个回答

5

CHAR

  • CHAR是固定长度的字符串数据类型,因此字段中剩余的空间填充了空格。
  • 每个字符占用1个字节。因此,一个CHAR(100)字段(或变量)在磁盘上占用100个字节,无论它保存的字符串是什么。

VARCHAR

  • VARCHAR是可变长度的字符串数据类型,因此只保留您分配给它的字符。
  • VARCHAR每个字符占用1个字节,+2个字节用于保存长度信息(例如,如果将VARCHAR(100)数据类型设置为“Dhanika”,则它将占用7个字节(D、H、A、N、I、K和A)加上2个字节,总共9个字节。)

我认为只需要1个字节来保存长度信息,而不是2个。 - Payel Senapati
Payel Senapati,这取决于该varchar的长度,但在255个字符之内,其长度为1个字节。然后它使用2到65535个字符,这也是varchars的限制。 - Lukáš Klíma

1

Char是一种固定长度的字符数据类型,Varchar是一种可变长度的字符数据类型。

由于Char是一种固定长度的数据类型,因此Char值的存储大小等于该列的最大大小。由于Varchar是一种可变长度的数据类型,因此Varchar值的存储大小是输入数据的实际长度,而不是该列的最大大小。

当预期某一列中的数据条目具有相同的大小时,可以使用Char。当预期某一列中的数据条目大小差异较大时,可以使用Varchar。


1
区分两者对于完整性方面也是有好处的。
如果您希望存储具有长度规则(例如是或否)的内容,则可以使用char(1)来存储Y或N。对于货币代码等内容也很有用,您可以使用char(3)来存储USD、EUR或AUD等内容。
然后,对于没有一般长度规则的内容,varchar更好,除了限制外。它适用于名称或描述等变化很大的值的情况。
然后,文本数据类型出现了,并且在工作中产生了问题(尽管通常只是没有定义上限的varchar)。

0

根据高性能MySQL书籍:

VARCHAR 存储可变长度的字符字符串,是最常见的字符串数据类型。它可以比固定长度类型需要更少的存储空间,因为它只使用所需的空间(即,存储较短值时使用的空间较少)。例外情况是使用 ROW_FORMAT=FIXED 创建的 MyISAM 表,它在磁盘上为每行使用固定数量的空间,因此可能会浪费空间。VARCHAR 有助于提高性能,因为它节省空间。

CHAR 是固定长度的:MySQL 总是为指定数量的字符分配足够的空间。当存储 CHAR 值时,MySQL 删除任何尾随空格。(这在 MySQL 4.1 和早期版本中也适用于 VARCHAR —— CHAR 和 VARCHAR 在逻辑上是相同的,只在存储格式上有所不同。)需要进行比较时,值将根据需要填充空格。


2
"VARCHAR 帮助提高性能,因为它节省空间" 它确实节省了空间,但是它不会对性能产生负面影响吗?相对于 CHARVARCHAR 需要动态分配内存,从而降低性能,对吗? - Spikatrix
@Spikatrix 这要看情况。如果VARCHAR值通常很小,但可能达到N字节,则动态分配可以节省大量空间和I/O,对于大量数据而言更具性能优势。长度大致相等的CHAR值将更具性能优势。读取与写入也可能有所不同。 - Andrew
固定长度数据类型的优点在于偏移量是可预测的,即如果您将CHAR(M)数组保存到磁盘,则知道第N项在字节偏移sizeof(char(M))* N处。因此,查找非常快,没有开销(索引等)。对于变长VARCHARS,您无法使用这种简单有效的方法。 - Alexander Torstling

-4

Char具有固定长度(支持2000个字符),它代表字符是一种数据类型

Varchar具有可变长度(支持4000个字符)


-1;这些数字对于MySQL来说不正确。(我认为它们可能是针对Oracle的?) - Mark Amery

-6

Char或Varchar-用于输入文本数据,其中长度可以在括号中指定。 例如-姓名char(20)


这并没有回答原问题。OP问的是类型之间的实际区别,而不是语法和用途。另外,()是括号,不是方括号。 - 2mac
@2mac,你的最后一句话只适用于美式英语;在英国,我们称 () 为括号,许多英国人可能甚至没有意识到在某些英语方言中,“parenthesis”这个词可以指标点符号。有很强的理由支持使用“parentheses”而不是“brackets”——当面向国际程序员受众时,这可能是最清晰的选择——但这比“brackets”错了更复杂。 - Mark Amery

-11

字符型:

  • 支持字符和数字。
  • 支持2000个字符。
  • 长度固定。

VARCHAR:

  • 支持字符和数字。
  • 支持4000个字符。
  • 长度可变。

有任何评论吗......!!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接