字符集和整理是什么意思?

我可以阅读MySQL文档,这很清楚。 但是,如何决定使用哪个字符集呢? 什么数据sorting有效?

我要求解释两者,以及如何select它们。

从MySQL 文档 :

字符集是一组符号和编码。 sorting规则是一组比较字符集中字符的规则。 我们用一个虚构的字符集的例子来明确区分。

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

现在,假设我们要比较两个string值“A”和“B”。 最简单的方法是查看编码:0代表'A',1代表'B'。 由于0小于1,我们说'A'小于'B'。 现在,我们刚才所做的是对我们的字符集应用sorting规则。 sorting规则是一组规则(在这种情况下只有一个规则):“比较编码”。 我们把这个最简单的所有可能的归类称为二进制归类。

但是如果我们想说小写字母和大写字母是等价的呢? 那么至less有两条规则:(1)把小写字母“a”和“b”等同于“A”和“B”。 (2)然后比较编码。 我们称之为不区分大小写的整理。 这比二进制sorting规则稍微复杂一些。

在现实生活中,大多数字符集都有很多字符,不仅包括字母“A”和“B”,还包括整个字母表,有时还有数千个字母的多个字母表或东方书写系统,还有许多特殊符号和标点符号。 同样在现实生活中,大多数的整理都有很多规则:不仅是不区分大小写,而且还有重音不敏感(一个“重音”是一个与德语中的字符相连的标记“ö”)和多字符映射(例如“ ö'='OE'在德国的两个sorting之一)。

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

sorting规则是如何比较字符,在拉丁语中,有字母表示,如果按照二进制表示进行sorting,它将会变为eféêè,但是如果sorting规则设置为法语,你会按照你以为他们会的顺序拥有它们,这是所有的e é è ê是平等的,然后f

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

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

select一个字符集和整理归结为您的应用程序是否国际化。 如果不是,您的目标是什么区域?

为了select你想要支持的字符集,你必须考虑你的应用程序。 如果您正在存储用户提供的input,则可能很难预见您的软件最终将被使用的所有语言环境。 为了支持他们,最好从一开始就支持UCS(Unicode)。 然而,这是一个成本, 现在许多西欧字符需要每个字符两个字节而不是一个字节。

如果您的数据库使用sorting规则来创build索引,那么select正确的sorting规则可以帮助提高性能,并在稍后使用该索引来提供sorting结果。 但是,由于整理规则通常是特定于语言环境的,因此如果您需要根据另一个语言环境的规则对结果进行sorting,那么该索引将毫无价值。

我build议使用utf8mb4_unicode_ci ,它是基于Unicode标准进行sorting和比较的,这种标准可以用很多种语言准确地sorting。