VARCHAR和CHAR有什么区别?


366

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

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


15
MD5哈希始终包含32个字符。因此,由于CHAR是固定长度的,因此请使用CHAR(32)来最大程度地提高性能(有关CHAR和VARCHAR之间差异的详细信息,请参见下面的答案)。
Augustin

Answers:


361

VARCHAR 是可变长度的。

CHAR 是固定长度。

如果您的内容是固定大小,则使用可获得更好的效果CHAR

有关详细说明,请参见CHAR和VARCHAR类型的MySQL页面(请确保还阅读注释)。


51
@steven:当Anon的时候。说“您的内容是固定大小”,这意味着表的行必须包含所有固定大小的字段。如果在一个字段中对VARCHAR使用CHAR,则性能不会得到改善,但是表中包含VARCHAR的其他字段。
Marco Demaio,2010年

2
没有char数据类型会增加性能...在执行查询sql时会生成一个执行计划。假设有2列charcol char(2000)和VarcharCol Varchar(2000)。在执行计划中,可能会估计varchar类型的列的估计行大小。因此,它导致溢出溢出到temp db。因此,使用char对性能有好处
vignesh 2014年

1
VARCHAR(n)的括号中的值是什么意思?
Sivagami Nambi

@Marco Demaio你知道背后的原因吗?
Dehan de Croos

1
@ jdc91:为了提高性能,整行必须为固定宽度。MySQL在计算这种表中的行空间需求和偏移量方面获得了优势。
Marco Demaio

225

焦炭

  1. 用于存储固定长度的字符串值。
  2. 最大编号 数据类型最多可容纳255个字符
  3. 它比VARCHAR 快50%
  4. 使用静态内存分配

VARCHAR

  1. 用于存储长度可变的字母数字数据。
  2. 此数据类型最多可容纳
    • MySQL 5.0.3之前的版本:255个字符
    • MySQL 5.0.3后:该行共享65,535个字符
  3. 它比CHAR
  4. 使用动态内存分配

3
我对如此频繁地回答这个答案感到有些惊讶。MySQL文档指出Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
更不用说您也可以在char中存储字母数字数据
ninjabber

44
这快50%的依据是什么?快50%做什么?在什么条件下?在这种情况下,静态内存分配与动态内存意味着什么?
马丁·史密斯

4
@MartinSmith我会问同样的..不要以为信息是准确的。asktom.oracle.com/pls/asktom/...
Özgür的律师

2
-1; 此处的性能说法含糊不清,没有根据,内存分配策略的差异(及其重要性)并未被充实,并且varchar存储“字母数字数据”的说法有点奇怪。varchar列当然也可以存储非字母数字字符!
Mark Amery

122

CHAR与VARCHAR

CHAR用于定长大小变量
VARCHAR用于定长大小变量。

例如

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

输出将是

length(City)          Length(street)
10                    6

结论:要有效地使用存储空间,必须在变量长度可变的情况下使用VARCHAR代替CHAR


4
城市= char(10),街道= varchar(10),城市=浦那,街道=牛津,长度(城市)= 4,长度(街道)= 6
abdulwadood

2
该查询(从temp中选择length(city),length(street))在mysql 5.7中给出以下输出mysql>从temp中选择length(city),length(street);+ -------------- + ---------------- + | 长度(城市)| 长度(街道)| + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- +设置1行(0.00秒)
Jasbeer Rawal

68

CHAR(x)列只能有完全相同的 x字符。
VARCHAR(x)列可以有多达 x字符。

由于您的MD5哈希值始终相同,因此您可能应该使用CHAR

但是,您不应该首先使用MD5。它具有已知的弱点。
请改用SHA2。
如果您对密码进行哈希处理,则应使用bcrypt。


44
“ CHAR(x)列只能有x个字符。” 实际上,您可以添加少于x个字符的数据,但我认为您的意思是它总是在后台保留10个字符的内存。
丹W

13
您不知道为什么他们要存储md5散列,有很多使用md5的正当理由与安全性无关。冲突根本不常见,算法比安全性更高。
约翰·亨特

1
假设CHAR(x)列未严格执行x个字符,即使对于固定大小的数据,也没有任何理由在VARCHAR(x)上使用它吗?
NeverEndingQueue '18

11

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

对于已经给出的答案,我想补充一下,在OLTP系统或频繁更新的系统中,考虑使用CHAR甚至用于可变大小的列,因为VARCHAR更新期间可能会出现列碎片。

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

如果安全真的很重要,则MD5哈希不是最佳选择。但是,如果您将使用任何哈希函数,请考虑BINARY使用它的类型(例如,MD5将产生16字节的哈希值,这样BINARY(16)就足够了,而不是CHAR(32)用于表示十六进制数字的32个字符。这将节省更多空间并提高性能。


按照这种思路,我将使用CHAR作为业务ID,以提高可读性和效率。我仍然会使用bigint主键。
Archimedes Trajano 2015年

9

如果输入的字符短于声明的长度,则Varchar会截断尾随空格,而char不会。Char将填充空格,并且将始终为声明长度的长度。在效率方面,varchar更擅长于修剪字符以进行更多调整。但是,如果您知道char的确切长度,则char将以更高的速度执行。


7

在当今的大多数RDBMS中,它们是同义词。但是,对于仍具有区别的那些系统,CHAR字段存储为固定宽度的列。如果将其定义为CHAR(10),则会将10个字符写入表中,其中“填充”(通常为空格)用于填充数据不会用完的任何空间。例如,保存“ bob”将另存为(“ bob” + 7个空格)。VARCHAR(可变字符)列旨在存储数据,而不会浪费CHAR列所占用的额外空间。

与往常一样,维基百科的声音更大。


5

CHAR是固定长度的字段;VARCHAR是一个可变长度字段。如果存储的字符串的长度具有非常大的可变性(例如名称),请使用VARCHAR,如果长度始终相同,则请使用CHAR,因为它的大小效率更高,并且速度也更快。


尽管我猜想这里关于速度和存储效率的说法是正确的,但它们都没有以任何方式得到证实(并且完全有理由认为它们是错误的),这使得该答案毫无用处。它只是重复了读者可能已经期望的真实情况,而没有做任何真正有助于确认的事情。
Mark Amery

1

CHAR是固定长度,而VARCHAR是可变长度。CHAR始终为每个条目使用相同数量的存储空间,而VARCHAR仅使用存储实际文本所需的数量。


1

char是定长字符数据类型,varchar是变长字符数据类型。

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

当期望列中的数据条目大小相同时,可以使用char。当列中的数据条目的大小预计会有很大差异时,可以使用varchar。


0

根据高性能MySQL的书:

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

CHAR是固定长度的:MySQL总是为指定数量的字符分配足够的空间。存储CHAR值时,MySQL会删除所有尾随空格。(在MySQL 4.1和更早版本中,VARCHAR也是这样-CHAR和VAR CHAR在逻辑上是相同的,只是存储格式有所不同。)值用比较所需的空格填充。


2
VARCHAR因为节省了空间而有助于提高性能 ”,虽然节省了空间,但是对性能没有负面影响吗?VARCHAR需要在需要时动态分配内存,从而降低了性能,而不是CHAR,对吗?
Spikatrix

@Spikatrix取决于。如果VARCHAR值通常很小,但最多可以为N个字节,则动态分配可以节省大量的空间和I / O,这对于处理大量数据更有效。长度大致相等的CHAR值将更具性能。读取与写入也可能有所不同。
安德鲁(Andrew)

-4

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

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


-1; 这些数字不适用于MySQL。(我认为他们可能适用于Oracle?)
Mark Amery

-5

Char或varchar-用于输入文本数据,其长度可以在方括号中表示。例如,char(20)


这没有解决原始问题。OP正在询问类型之间的实际区别,而不是类型的语法和用途。并且()是括号,而不是括号。
2mac

@ 2mac您的最后一句话仅适用于美国英语;在英国,我们呼吁()支架,以及许多英国人可能甚至不知道,有英语的方言中的单词“括号”可以指一个标点符号。有一个很强的理由倾向于“括号”而不是“括号”-总的来说,在面向国际程序员群体时,它是最大明确的选择-但是,比“括号”错误更复杂。
Mark Amery

-11

字符:

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

VARCHAR:

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

任何意见......!!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.