存储 MD5 CHAR(32) 时选择啥 MySQL 排序规则?

Posted

技术标签:

【中文标题】存储 MD5 CHAR(32) 时选择啥 MySQL 排序规则?【英文标题】:What MySQL collation to select when storing MD5 CHAR(32)?存储 MD5 CHAR(32) 时选择什么 MySQL 排序规则? 【发布时间】:2021-02-01 00:21:19 【问题描述】:

我将MD5 hashes 存储为一些记录的索引,我知道CHAR(32) 是一个很好的数据类型,但我应该为collation 选择什么?

我认为 MD5 仅支持这些字符是相关的:abcdef0123456789 所以我需要一个支持很少字符且不支持特殊字符的排序规则?

Eider way,哪一个是最好的排序方式?许多其他数据行在我的数据库中使用utf8_general_ci

【问题讨论】:

【参考方案1】:

您需要“A”==“a”吗?如果是这样,你需要一个案例折叠COLLATION

但首先,我怀疑您的问题实际上是关于 CHARACTER SET。这是字符的编码。几乎任何字符集都可以处理十六进制字符。 ascii 很好; latin1 很好。除了用于 MD5、UUID、country_code、postal_code 等的字符集之外,我不会使用任何字符集。而且,由于每个字符集都是恒定长度,CHAR(..) 很有用。几乎在其他任何地方,VARCHAR(..) 都“更好”。

“排序规则”与排序和比较有关。一旦你决定了CHARACTER SET ascii(或latin1),那么你需要决定你是否需要比较a1b2 = A1B2。如果是这样,请使用ascii_general_ci(或latin1_general_ci)。 “ci”表示“不区分大小写”。

如果您永远不会混合大小写,ascii_bin (latin1_bin) 很好,而且速度会微不足道。 “bin”的意思是“只比较位”;也就是说,没有大小写折叠,重音剥离。等等

更好的方法是通过UNHEX()CHAR(32) 转换为BINARY(16),然后通过HEX() 转换为另一种方式。这没有排序规则并将使用的空间减少一半。 (但它使字符串无法打印。)

对于其他列,... 字符集 utf8mb4,而不是 utf8,需要中文和表情符号(如您的图片)。如果不了解您的应用程序的更多信息,我无法判断 _general_ci collat​​ion 是否合适。

【讨论】:

好的,看来我需要对CHARACTER SET 进行更多研究,因为我现在有点迷路了。你在这里漏掉了一个动词吗? I would not any 所以我知道要存储 MD5 值,latin 字符集就可以,但是如果我有一个表格需要保存带有中文字符的 url 标题,那么使用 @987654341 是正确的@字符集,没有? @adrianTNT - MD5、UUID、country_code、postal_code 等:CHAR(...) CHARACTER SET latin1;根据折叠案例的需要选择排序规则。中文:最好用utf8mb4,有些汉字需要4个字节。 (我修正了错字。)

以上是关于存储 MD5 CHAR(32) 时选择啥 MySQL 排序规则?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL数据表中要存储密码要用啥类型

在 mysql 中有效存储 md5 哈希的最佳实践

CRC32+大小与 MD5/SHA1

MySQ 存储引擎选择

应该使用哪种数据类型来存储哈希?

char能储存啥?