329

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

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

4

4 回答 4

532

来自 MySQL文档

字符集是一组符号和编码。排序规则是一组用于比较字符集中的字符的规则。让我们通过一个假想字符集的例子来明确区分。

假设我们有一个包含四个字母的字母表:“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' 在两个德语排序规则之一中)。

于 2008-12-04T17:02:36.510 回答
212

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

排序规则是如何比较字符,在e é è ê flatin9e f é ê è中,有字母为会是,所有的e é è ê都是平等的,然后f.

于 2008-12-04T17:06:24.957 回答
21

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

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

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

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

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

于 2008-12-04T17:42:29.627 回答
5

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

于 2017-03-06T11:58:38.647 回答