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


Answers:


511

从MySQL 文档

字符集是一组符号和编码。甲归类为在一个字符集的字符进行比较的一组规则。让我们用一个假想字符集的例子来使区别清楚。

假设我们有一个包含四个字母的字母:“ A”,“ B”,“ a”,“ b”。我们给每个字母一个数字:'A'= 0,'B'= 1,'a'= 2,'b'=3。字母'A'是一个符号,数字0是'A'的编码,并且所有四个字母及其编码的组合是一个字符集。

现在,假设我们要比较两个字符串值“ A”和“ B”。最简单的方法是查看编码:“ A”为0,“ B”为1。因为0小于1,我们说“ A”小于“ B”。现在,我们刚刚完成的操作是将排序规则应用于字符集。排序规则是一组规则(在这种情况下,只有一个规则):“比较编码”。我们将所有可能的排序规则中最简单的排序规则称为二进制排序规则。

但是,如果我们想说小写字母和大写字母是等效的呢?那么我们将至少有两个规则:(1)将小写字母“ a”和“ b”等同于“ A”和“ B”;(2)然后比较编码。我们称此为不区分大小写的排序规则。它比二进制排序规则要复杂一些。

在现实生活中,大多数字符集都有许多字符:不仅是“ A”和“ B”,而且还包括整个字母,有时甚至是多个字母或带有数千个字符的东部书写系统,以及许多特殊符号和标点符号。同样在现实生活中,大多数排序规则都有许多规则:不仅不区分大小写,而且还具有重音不敏感(“重音”是附加在字符上的标记,如德语中的“ö”)和多字符映射(例如“ ö'='OE'在两个德国归类之一中)。


206

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

整理是如何比较字符,在latin9,有字母e é è ê f,如果排序由二进制表示,它会去e f é ê è,但是当核对设定,例如,法语,你就会有他们的顺序,你认为他们将会是,所有的e é è ê都相等,然后f


5
重要的是要注意,单个字符集可能有许多不同的排序规则。一个是“正确的”依赖于它通常是由它的编写语言确定文本的语义。
菲尔-

20

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

排序规则包含一些规则,这些规则指定如何比较字符以进行排序。归类规则可以是特定于语言环境的:两个字符的正确顺序因语言而异。

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

为了选择要支持的字符集,必须考虑您的应用程序。如果要存储用户提供的输入,可能很难预见最终将在其中使用软件的所有语言环境。为了支持所有这些功能,最好从一开始就支持UCS(Unicode)。但是,这样做是有代价的。现在,许多西欧字符将需要每个字符存储两个字节,而不是一个字节。

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


抱歉,老兄,我只是初学者,只需要您澄清一下即可。因此,我可以理解这样的排序规则,这是确保正确识别每个字符(拉丁语或中文)并指定相应编码的原因。那是对的吗?希望您的答复
Mirich

1
@Mirich否,排序规则是有关如何对字符进行排序的信息。世界上的不同地区更喜欢以不同的方式对字符进行排序。
erickson

3

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


3
OP中的文章:“我要求对两者以及如何选择它们进行解释”
Dan Esparza

1
@simhumileco,对不起,老兄,我只是初学者,只需要您澄清一下即可。因此,我可以理解这样的排序规则,这是确保正确识别每个字符(拉丁语或中文)并指定相应编码的原因。那是对的吗?希望您的答复
Mirich

1
@Mirich这完全取决于您在其他地方使用的UTF-8编码,如果您在数据库之外的系统中使用编码,那么如果utf8mb4MySQL中使用数据库,则还应该正确编写数据库中的所有内容。在MySQL中对特定字符的文本进行排序,比较和转换的正确操作时,很难找到完美的解决方案,但*_unicode_ci肯定比更好*_general,但也有其缺点。请阅读:dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.