我可以为 md5() 值使用 VARCHAR(32) 吗?

22

我能在MySQL数据库中使用长度为32且类型为VARCHAR的字段来存储md5()值吗?


3
你为什么要使用MD5? - Mitch Wheat
你可以这样做,但我不确定你是否想这么做。 - Paul Tomblin
2
为什么我不应该使用md5? - Michael
http://stackoverflow.com/q/3897434/1291428 - Sebas
http://en.wikipedia.org/wiki/MD5#Security - Jonathan
3
所有这些链接都表示,对于某些用途来说,使用MD5是不安全的。但MD5仍然有其他合法的用途。 - Nicolas Marshall
2个回答

46

由于md5始终产生固定长度的结果,更好地使用CHAR(32)


谢谢,char和varchar有什么区别呢? - Michael
它们以不同的方式存储和检索。阅读更多请访问 http://dev.mysql.com/doc/refman/5.0/en/char.html - Marko D
你不能在一个表中混合使用char和varchar - 所以,无所谓。varchar是可以的。 - Your Common Sense
@YourCommonSense 如果一个列是 varchar(128),但只存储了 32 个字符(1 字节字符),那么当加载到内存中时,它将占用 128 个字节的空间。这是真的吗? - जलजनक
7
我认为应该将字段定义与其所包含的内容相匹配。如果值永远不会超出32个字符,则将其定义为char(32)。如果它可以达到254个字符(例如电子邮件地址),则将其定义为varchar(254)。尽可能向数据库提供字段的最佳信息,并让它尽可能地进行优化处理。关系型数据库存在已经很长时间,并且内置有多种优化方法。即使当前版本缺少此处的优化,未来版本也可以加入。不要通过对数据库编造数据来使问题变得更加困难。 - Michael Cordingley
显示剩余2条评论

1
最好使用latin1字符集和CHAR(32),或者如果您想节省更多空间,则使用BINARY(16)
CREATE TABLE ... (
    ...
    md5 CHAR(32) CHARACTER SET 'latin1' NOT NULL
    ...

自MySQL 5.7版本起,默认字符集为utf8mb4,而使用utf8mb4CHAR(32)占用128个字节,比VARCHAR(32)更劣。


utf8/utf8mb4是一种可变长度编码。使用CHAR(32)来存储md5值只需要占用32个字节,而不是128个字节。这仅在对该字段进行索引时才会有影响。我认为很少有人会对md5字段进行索引。 - petertc
@petertc 使用CHAR(32)进行md5只需要32个字节。我不这么认为。如果MySQL真的将utf8 / utf8mb4 CHAR(32)视为可变长度,并且如果我用非ASCII字符(如ü)替换一个字母或数字字符,则长度可能从32个字节更改为33个字节,是吗?但是MySQL如何存储该列的长度信息呢? - auntyellow
CHAR和VARCHAR类型是通过指定长度来声明的,该长度表示您希望存储的最大字符数,而不是字节数。CHAR/VARCHAR(32)可能占用32~128个字节(不包括长度前缀)。 - petertc

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