我可以阅读 MySQL 文档,而且非常清楚。但是,如何决定使用哪个字符集?整理对哪些数据有影响?
我要求解释这两者以及如何选择它们。
从 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' 在两个德语排序规则之一中)。
character encoding 是一种对字符进行编码以使其适合内存的方法。也就是说,如果字符集是 ISO-8859-15,欧元符号 € 将被编码为 0xa4,而在 UTF-8 中,它将被编码为 0xe282ac。
collation 是如何比较字符,在 latin9 中,有字母为 e é è ê f
,如果按其二进制表示排序,它将变为 e f é ê è
,但如果排序规则设置为例如法语,您将按照您认为的顺序排列它们,即所有 e é è ê
都相等,然后是 f
。
字符集是所有书面字形的子集。字符编码指定这些字符如何映射到数值。一些字符编码,如 UTF-8 和 UTF-16,可以对通用字符集中的任何字符进行编码。其他的,如 US-ASCII 或 ISO-8859-1 只能编码一个小子集,因为它们分别使用每个字符 7 位和 8 位。因为许多标准都指定了字符集和字符编码,所以术语“字符集”经常被自由地替换为“字符编码”。
排序规则包含指定如何比较字符以进行排序的规则。排序规则可以是特定于语言环境的:两个字符的正确顺序因语言而异。
选择字符集和排序规则取决于您的应用程序是否国际化。如果不是,您的目标是什么语言环境?
为了选择您想要支持的字符集,您必须考虑您的应用程序。如果您要存储用户提供的输入,则可能很难预见您的软件最终将在哪些语言环境中使用。为了支持所有这些,最好从一开始就支持 UCS (Unicode)。但是,这是有代价的;许多西欧字符现在每个字符需要两个字节的存储空间,而不是一个。
如果您的数据库使用排序规则创建索引,然后使用该索引提供排序结果,则选择正确的排序规则有助于提高性能。但是,由于排序规则通常是特定于语言环境的,如果您需要根据另一个语言环境的规则对结果进行排序,那么该索引将毫无价值。
我建议使用 utf8mb4_unicode_ci
,它基于 Unicode 标准进行排序和比较,可以在非常广泛的语言中准确排序。
UTF-8
编码,那么如果您在 MySQL 中使用 utf8mb4
,那么数据库中的所有内容也应该正确编写。在MySQL中针对特定字符对文本进行排序、比较和转换的正确操作,很难找到完美的解决方案,但*_unicode_ci
肯定比*_general
好,但它也有它的缺点。请阅读:dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
不定期副业成功案例分享