字符集和整理意味着什么?

时间:2008-12-04 16:47:02

标签: mysql database database-design character-set

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

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

4 个答案:

答案 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标准进行排序和比较,可以在各种语言中进行准确排序。