VARCHAR和CHAR在MySQL中有什么区别?
我正在尝试存储MD5哈希值。
VARCHAR
是可变长度的。
CHAR
是固定长度的。
如果您的内容是固定大小的,使用CHAR
将获得更好的性能。
请参阅MySQL关于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。
CHAR(x)
表示该列只能容纳 恰好 x
个字符。
VARCHAR(x)
表示该列最多可容纳 不超过 x
个字符。
由于 MD5 哈希值始终具有相同的大小,您应该使用 CHAR
类型。
然而,您本来就不应该使用 MD5;它已经被证明存在弱点。
请改用 SHA2。
如果要对密码进行哈希操作,请使用 bcrypt。
在MySQL中,VARCHAR和CHAR有什么区别?
对于已经给出的答案,我想补充一点,在OLTP系统或者频繁更新的系统中,建议即使是对于可变尺寸的列,也可以考虑使用CHAR
,这是因为更新期间可能会导致VARCHAR
列的碎片化。
我正在尝试存储MD5哈希值。
如果确实涉及到安全问题,那么MD5哈希值并不是最好的选择。但是,如果您要使用任何哈希函数,请考虑使用BINARY
类型(例如,MD5将生成16字节哈希值,因此BINARY(16)
就足够了,而不需要使用32个十六进制数字来表示字符的CHAR(32)
。这样可以节省更多的空间,并且效率更高。
Varchar会在输入的字符长度比声明长度短时切断尾随空格,而char则不会。Char会填充空格,并始终具有声明长度。就效率而言,varchar更为灵活,因为它修剪字符以允许更多调整。然而,如果您知道char的确切长度,char将以稍微更快的速度执行。
CHAR是固定长度的,而VARCHAR是可变长度的。每个CHAR输入始终使用相同的存储空间,而VARCHAR仅使用存储实际文本所需的空间。
CHAR是固定长度字段;VARCHAR是可变长度字段。如果您要存储长度差异很大的字符串,比如姓名,那么请使用VARCHAR,如果长度始终相同,则使用CHAR,因为它稍微更节省空间,并且速度稍微更快。
CHAR
VARCHAR