我可以阅读 MySQL 文档,而且非常清楚。但是,如何决定使用哪个字符集?整理有哪些数据会产生影响?
我要求解释这两者以及如何选择它们。
答案 0 :(得分:480)
来自MySQL docs:
字符集是一组符号 和编码。 整理是一组 用于比较a中字符的规则 字符集。让我们做吧 区别明确的例子 一个虚构的字符集。
假设我们有一个字母表 四个字母:'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'。现在,我们做了什么 刚刚完成的是对我们进行整理 字符集。整理是一组 规则(在这种情况下只有一条规则): “比较编码。”我们称之为 最简单的所有可能的排序规则a 二进制整理。
但如果我们想说的话呢? 小写和大写字母是 当量?然后我们会在 至少两条规则:(1)对待 小写字母'a'和'b'为 相当于'A'和'B'; (2)然后 比较编码。我们称之为 不区分大小写的排序规则。它是 比二进制更复杂 排序规则。
在现实生活中,大多数角色都有 很多人物:不只是'A'和'B' 但有时整个字母 多个字母或东部写作 有数千个字符的系统, 以及许多特殊的符号和 标点符号。在现实生活中, 大多数校对都有很多规则:不是 只是不区分大小写,但也 重音不敏感(“重音”是一个 附加到角色的标记,如 德语'ö')和多重角色 映射(例如'ö'=的规则 两个德国人中的一个'OE' 归类)。
答案 1 :(得分:192)
character encoding是一种对字符进行编码以便它们适合内存的方法。也就是说,如果字符集是ISO-8859-15,欧元符号€将被编码为0xa4,而在UTF-8中,它将被编码为0xe282ac。
collation是如何比较字符的,在latin9中,有字母为e é è ê f
,如果按其二进制表示排序,它将为e f é ê è
但如果整理设置为例如,法语,您将按照您认为的顺序排列它们,e é è ê
全部相等,然后f
。
答案 2 :(得分:20)
字符集是所有书写字形的子集。字符编码指定这些字符如何映射到数值。某些字符编码(如UTF-8和UTF-16)可以编码通用字符集中的任何字符。其他像US-ASCII或ISO-8859-1只能编码一个小子集,因为它们分别使用每个字符7和8位。由于许多标准都指定了字符集和字符编码,因此术语“字符集”通常可以自由替换为“字符编码”。
排序规则包含指定如何比较字符以进行排序的规则。排序规则可以是特定于语言环境的:两个字符的正确顺序因语言而异。
选择字符集和整理归结为您的应用程序是否已国际化。如果没有,您定位的是哪个区域设置?
为了选择您想要支持的字符集,您必须考虑您的应用程序。如果要存储用户提供的输入,则可能很难预见最终将使用软件的所有语言环境。为了支持它们,最好从一开始就支持UCS(Unicode)。但是,这需要付出代价;许多西欧角色现在每个角色需要两个字节的存储而不是一个。
如果数据库使用排序规则来创建索引,并且稍后使用该索引提供排序结果,则选择正确的排序规则可以提高性能。但是,由于排序规则通常是特定于语言环境的,如果您需要根据另一个语言环境的规则对结果进行排序,那么该索引将毫无价值。
答案 3 :(得分:3)
我建议使用utf8mb4_unicode_ci
,它基于Unicode标准进行排序和比较,可以在各种语言中进行准确排序。