VARCHAR和CHAR有什么区别?

ste*_*ven 340 mysql sql

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

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

Ano*_*on. 338

VARCHAR 是可变长度的.

CHAR 是固定长度.

如果您的内容是固定大小的,那么您将获得更好的性能CHAR.

有关详细说明,请参阅CHAR和VARCHAR类型的MySQL页面(请务必阅读注释).

  • @steven:当Anon.说"你的内容是一个固定的大小",这意味着你的表的行必须包含所有固定大小的字段.如果在一个字段中对VARCHAR使用CHAR,则不会提高性能,但该表包含VARCHAR的其他字段. (46认同)
  • 没有char数据类型添加性能...执行查询时,sql将生成执行计划.假设有两列charcol char(2000)和VarcharCol Varchar(2000).在执行计划中,varchar类型列的估计行大小可能低于估计值.因此它导致溢出到临时数据库.所以使用char有利于提高性能 (2认同)

小智 210

CHAR

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

VARCHAR

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

  • 什么是基于这50%的速度?做什么快50%?在什么条件下?在这种情况下,静态内存分配与动态是什么意思? (36认同)
  • -1; 这里的性能声明是模糊且未经证实的,内存分配策略的差异(及其重要性)没有得到充实,并且 varchar 存储“字母数字数据”的声明有点奇怪;varchar 列当然也可以存储非字母数字字符! (5认同)
  • @MartinSmith我会问同样的......不要认为这些信息是准确的.https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476 (4认同)
  • 我有点惊讶的是,这个答案经常受到欢迎.MySQL文档声明`VARCHAR列中的值是可变长度字符串.长度可以指定为MySQL 5.0.3之前的0到255之间的值,5.0.3及更高版本中的0到65,535之间的值. (3认同)
  • 更不用说您也可以在char中存储字母数字数据 (2认同)

P S*_*rma 116

CHAR Vs 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;
Run Code Online (Sandbox Code Playgroud)

输出将是

length(City)          Length(street)
10                    6
Run Code Online (Sandbox Code Playgroud)

结论:要有效地使用存储空间,必须使用VARCHAR而不是CHAR,如果变量长度是可变的

  • City = char(10),Street = varchar(10),city = Pune,street = Oxford,length(city)= 4,length(street)= 6 (3认同)
  • 该查询(从temp中选择length(city),length(street))在mysql 5.7中给出以下输出。mysql>从temp中选择length(city),length(street);+ -------------- + ---------------- + | 长度(城市)| 长度(街道)| + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- +设置1行(0.00秒) (2认同)

SLa*_*aks 62

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

由于你的MD5哈希值总是相同,你应该使用a CHAR.

但是,您不应该首先使用MD5; 它已知缺点.
请改用SHA2.
如果您正在哈希密码,则应使用bcrypt.

  • "CHAR(x)列只能有x个字符." 实际上,你可以添加少于x个字符的数据,但我认为你的意思是它总是在后台保留10个字符值的内存. (42认同)
  • 你不知道为什么他们存储md5哈希,使用md5的许多有效理由与安全性无关.碰撞根本不常见,算法比更安全的算法更快. (11认同)
  • 假设 CHAR(x) 列不完全强制使用 x 字符,即使对于固定大小的数据,是否有任何理由使用它而不是 VARCHAR(x) ? (2认同)

Don*_*oer 9

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


小智 9

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

要查看有关此内容的更多详细信息,请查看:

http://www.allthingsdiscussed.com/More/Difference-between-char-and-varchar-in-mysql


Gry*_*har 9

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

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

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

如果安全性非常重要,MD5哈希不是最佳选择.但是,如果您将使用任何哈希函数,请考虑BINARY使用它的类型(例如,MD5将产生16字节哈希,因此BINARY(16)足以CHAR(32)代表表示十六进制数字的32个字符.这将节省更多空间并提高性能.


mob*_*eek 7

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

与往常一样,维基百科说得更响亮.


Asi*_*kib 6

字符

  1. 使用特定的内存分配
  2. 省时高效

VARCHAR

  1. 使用动态分配内存
  2. 内存高效


And*_*rew 5

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


Dha*_*ika 5

字符

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

VARCHAR

\n
    \n
  • VARCHAR 是一种可变长度字符串数据类型,因此它仅保存您分配给它的字符。
  • \n
  • VARCHAR 每个字符占用 1 个字节,+ 2 个字节来保存长度信息(例如,如果设置 VARCHAR(100) 数据类型 = \xe2\x80\x98Dhanika\xe2\x80\x99,那么它将占用 7 个字节(对于 D、H、A、N、I、K 和 A)加上 2 个字节,即总共 9 个字节。)
  • \n
\n