存储 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 collation 是否合适。
【讨论】:
好的,看来我需要对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 排序规则?的主要内容,如果未能解决你的问题,请参考以下文章