字符集和排序规则到底是什么意思?

我可以阅读MySQL文档,它非常清楚。但是,如何决定使用哪个字符集呢?排序对哪些数据有影响?

我要你解释一下这两种,以及如何选择。

126860 次浏览

从MySQL 文档:

A 字符集是一组符号 和编码。排序是一个集合 中的字符比较规则 字符集。我们来做 用一个例子来区分清楚 一个虚构的字符集。

假设我们有一个字母 四个字母:'A', 'B', 'A', 'B'。我们 给每个字母一个数字:' a ' = 0, 'B' = 1, 'a' = 2, 'B' = 3。这封信 “A”是一个符号,数字0是 'A'的编码和组合 这四个字母和他们的 Encodings是一个字符集。

现在,假设我们想要进行比较 两个字符串值,'A'和'B'。的 最简单的方法就是看 编码:0表示'A', 1表示 “B”。因为0小于1 “A”小于“B”。现在,我们已经 刚刚完成的是对我们的 字符集。排序规则是一个集合 规则(本例中只有一条规则): "比较编码。"我们称之为 所有可能的排序中最简单的一种 二进制排序。< / p > 但是如果我们想说 小写字母和大写字母是一样的 等效?然后是at 至少两条规则:(1)对待 小写字母“a”和“b” 相当于“A”和“B”;(2)然后 比较编码。我们称之为a 不区分大小写排序。这是一个 比二进制复杂一点 排序。< / p > 在现实生活中,大多数字符集都有 很多字符:不仅仅是“A”和“B” 但有时是整个字母 多种字母或东方文字 有成千上万个字符的系统, 连同许多特殊的符号和 标点符号。在现实生活中, 大多数排序规则有很多:不是 只是不区分大小写 口音不敏感(一个“口音”是一个 附在字符上的标记,如在 德语“ö”)和多个字符 映射(例如'ö' = “OE”是两个德语中的一个 排序)。< / p >

字符编码是一种编码字符以使它们适合内存的方法。也就是说,如果字符集是ISO-8859-15,那么欧元符号€将被编码为0xa4,而在UTF-8中,它将被编码为0xe282ac。

排序是如何比较字符的,在latin9中,有字母为e é è ê f,如果按照它们的二进制表示进行排序,它将进入e f é ê è,但如果排序规则设置为,例如,法语,你将按照你认为的顺序排列它们,即所有e é è ê都相等,然后是f

字符集是所有书写符号的子集。字符编码指定如何将这些字符映射到数值。一些字符编码,如UTF-8和UTF-16,可以编码通用字符集中的任何字符。其他的,如US-ASCII或ISO-8859-1只能编码一小部分,因为它们分别为每个字符使用7位和8位。由于许多标准同时规定了字符集和字符编码,术语“字符集”经常被自由地替换为“字符编码”。

排序规则由指定如何比较字符进行排序的规则组成。排序规则可以是特定于语言环境的:两个字符的正确顺序因语言而异。

选择字符集和排序规则取决于应用程序是否国际化。如果不是,你的目标市场是什么?

为了选择要支持的字符集,您必须考虑您的应用程序。如果您存储的是用户提供的输入,那么可能很难预见软件最终将在哪些地区使用。为了支持所有这些,最好从一开始就支持UCS (Unicode)。然而,这是有代价的;许多西欧字符现在每个字符需要两个字节的存储空间,而不是一个。

如果数据库使用排序规则创建索引,然后使用该索引提供排序结果,那么选择正确的排序规则有助于提高性能。但是,由于排序规则通常是特定于语言环境的,如果需要根据另一个语言环境的规则对结果进行排序,那么该索引将毫无价值。

我建议使用utf8mb4_unicode_ci,它基于用于排序和比较的Unicode标准,可以在非常广泛的语言中准确排序。