存储 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 collation 是否合适。
我正在将 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 collation 是否合适。