ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我要求解释这两者以及如何选择它们。


r
revo

从 MySQL docs

字符集是一组符号和编码。排序规则是一组用于比较字符集中的字符的规则。让我们通过一个假想字符集的例子来明确区分。假设我们有一个包含四个字母的字母表:“A”、“B”、“a”、“b”。我们给每个字母一个数字:'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3。字母'A'是一个符号,数字0是'A'的编码, 所有四个字母及其编码的组合是一个字符集。现在,假设我们要比较两个字符串值“A”和“B”。最简单的方法是查看编码:0 表示“A”,1 表示“B”。因为 0 小于 1,所以我们说“A”小于“B”。现在,我们刚刚做的是对我们的字符集应用排序规则。排序规则是一组规则(在这种情况下只有一个规则):“比较编码”。我们将所有可能的排序规则中最简单的称为二进制排序规则。但是如果我们想说小写字母和大写字母是等价的呢?那么我们至少有两条规则:(1)将小写字母'a'和'b'视为等同于'A'和'B'; (2) 然后比较编码。我们称之为不区分大小写的排序规则。它比二进制排序规则复杂一点。在现实生活中,大多数字符集都有许多字符:不仅仅是“A”和“B”,而是整个字母表,有时是多个字母表或具有数千个字符的东方书写系统,以及许多特殊符号和标点符号。同样在现实生活中,大多数排序规则都有许多规则:不仅不区分大小写,而且不区分重音(“重音”是附加到字符上的标记,如德语中的 'ö')和多字符映射(例如 ' ö' = 'OE' 在两个德语排序规则之一中)。


谢谢,但您没有回答我们应该如何为我们的数据库、表等选择最佳的 CHARSET 和 COLLATION?对于 CHARSET,我认为答案很简单,我们应该选择包含我们将在数据库、表等中使用的字符的 CHARSET。但是最好的 COLLATION 呢?
i
informatik01

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

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


需要注意的是,单个字符集可能有许多不同的排序规则。哪个是“正确的”取决于文本的语义,这通常由它所用的语言决定。
e
erickson

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

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

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

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

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


抱歉,伙计,我只是初学者,只需要您的澄清。所以,我能理解这样的排序规则吗,它可以确保每个字符(拉丁语或中文)都被正确识别并给出相应的编码。那是对的吗?我希望你的答复
@Mirich 不,排序规则是有关如何对字符进行排序的信息。世界上不同的地区更喜欢以不同的方式对字符进行排序。
s
simhumileco

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


来自 OP:“我要求解释这两者以及如何选择它们”
@simhumileco,对不起伙计,我只是初学者,只需要您的澄清。所以,我能理解这样的排序规则吗,它可以确保每个字符(拉丁语或中文)都被正确识别并给出相应的编码。那是对的吗?我希望你的答复
@Mirich这完全取决于您在其他地方使用的编码,如果您在数据库之外的系统中使用 UTF-8 编码,那么如果您在 MySQL 中使用 utf8mb4 ,那么数据库中的所有内容也应该正确编写。在MySQL中针对特定字符对文本进行排序、比较和转换的正确操作,很难找到完美的解决方案,但*_unicode_ci肯定比*_general好,但它也有它的缺点。请阅读:dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html