存储 MD5 CHAR(32) 时,MySQL 与 select 的排序规则是什么?

What MySQL collation to select when storing MD5 CHAR(32)?

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

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

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

您需要“A”==“a”吗?如果是这样,您需要 case-folding COLLATION.

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

“整理”与排序和比较有关。一旦你对 CHARACTER SET ascii(或 latin1)、 进行了 decided,你需要 decide 是否需要比较 a1b2 = A1B2。如果是这样,请使用 ascii_general_ci(或 latin1_general_ci)。 “ci”表示“不区分大小写”。

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

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

对于其他栏目,...中文和表情符号(如您的图片)需要字符集utf8mb4,而不是utf8。在不进一步了解您的应用程序的情况下,我无法判断 _general_ci collat​​ion 是否合适。