【问题标题】:Can I use VARCHAR(32) for md5() values?我可以将 VARCHAR(32) 用于 md5() 值吗?
【发布时间】:2013-02-02 01:14:29
【问题描述】:

我可以在 MySQL 数据库中使用长度为 32 且类型为 VARCHAR 的字段作为 md5() 值吗?

【问题讨论】:

  • 你为什么使用MD5?
  • 你可以,但我不确定你是否愿意。
  • 为什么我不应该使用 md5?
  • 所有这些链接都说,它对于某些用途是不安全的。 md5 还有其他有效用途。

标签: php mysql md5


【解决方案1】:

如果您想节省更多空间,最好将CHAR(32)latin1 字符集一起使用,或者BINARY(16)

CREATE TABLE ... (
    ...
    md5 CHAR(32) CHARACTER SET 'latin1' NOT NULL
    ...

MySQL 从 5.7 开始使用 utf8mb4 作为默认字符集,而 CHAR(32)utf8mb4 占用 128 个字节,比 VARCHAR(32) 差。

【讨论】:

  • utf8/utf8mb4 是可变长度编码。对 md5 使用 CHAR(32) 将只占用 32 个字节而不是 128 个字节。仅在索引此字段时才重要。我认为很少有人索引 md5 字段。
  • @petertc Use CHAR(32) for md5 will only take 32 bytes 我不这么认为。如果 MySQL 真的将 utf8/utf8mb4 CHAR(32) 视为可变长度,并且如果我将一个字母或数字字符替换为像 ü 这样的非 ascii 字符,则长度可能会从 32 字节变为 33 字节,不是吗?但是 MySQL 如何存储该列的长度信息?
  • CHAR 和 VARCHAR 类型的声明长度表示要存储的最大字符数。
【解决方案2】:

由于 md5 总是产生固定长度的结果,最好使用 CHAR(32)

【讨论】:

  • 谢谢,那么char和varchar有什么区别呢?
  • 它们以不同的方式存储和检索。阅读更多dev.mysql.com/doc/refman/5.0/en/char.html
  • 您不能将 char 和 varchar 混合在一张表中 - 所以,没关系。 varchar 没问题。
  • @YourCommonSense varchar 数据以完整大小加载到内存中。我的意思是如果一列是varchar(128),并且其中只存储了 32 个字符(1 个字节字符);当加载到内存时,它占用 128 个字节。这是真的吗?
  • 我主张使字段定义与字段将包含的内容相匹配。如果该值永远不会偏离 32 个字符,请将其设为 char(32)。如果它可以达到 254(例如对于电子邮件地址),则将其设为 varchar(254)。为数据库提供您在某个领域拥有的最佳信息,并让它尽可能地处理优化。关系数据库已经存在了很长时间,并且内置了一些优化。即使当前版本在这里缺少优化,未来的版本也可以。不要因为您的数据而对数据库撒谎,从而使事情变得更难。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多