MySQL字符集、字符编码与COLLATE

何为字符集?

字符集就是一系列字符的集合。字符是各种文字和符号的统称,包括各个国家文字、标点符号、表情、数字等等。每个字符集根据使用的字节数不同, 可以表示的字符范围也不同。

计算机只能存储二进制的数据,所以像英文、汉字、符号等字符需要进行编码后转换成二进制数据进行存储, 这个过程称为"字符编码"。比如说字符a对应二进制“1100001”,反之,“1100001”则对应字符 a。

常见的字符集有 ASCII、GB2312、GBK、UTF-8等。

不同的字符集的主要区别在于:

  1. 可以表示的字符范围
  2. 编码方式

不同的字符集可以表示的字符范围以及编码规则存在差异。当编码方式与解码方式不一致时, 就会出现乱码的现象。

Unicode 字符集中包含了世界上几乎所有已知的字符。不过,Unicode 字符集并没有规定如何存储这些字符(也就是如何使用二级制数据表示这些字符)。

然后,就有了 不同的编码方式: UTF-8(8-bit Unicode Transformation Format)、 UTF-16、 UTF-32。

UTF-8 使用 1 到 4 个字节为每个字符编码, UTF-16 使用 2 或 4 个字节为每个字符编码,UTF-32 固定位 4 个字节为每个字符编码。

UTF-8 可以根据不同的符号自动选择编码的长短,像英文字符只需要 1 个字节就够了,这一点 ASCII 字符集一样 。因此,对于英语字符,UTF-8 编码和 ASCII 码是相同的。

MySQL字符集

可以通过命令查看支持的字符集:

SHOW CHARSET

MySQL 字符编码集中有两套 UTF-8 编码实现:

  1. utf8 :utf8编码只支持1-3个字节 。在 utf8 编码中,中文是占 3 个字节,其他数字、英文、符号占一个字节。但 emoji 符号占 4 个字节,一些较复杂的文字、繁体字也是 4 个字节。
  2. utf8mb4 :UTF-8 的完整实现,最多支持使用 4 个字节表示字符,因此,可以用来存储 emoji 符号。

MySQL COLLATE是什么

排序的规则。对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知mysql如何对该列进行排序和比较. 另外,mysql建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。总之,凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关。

COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如utf8mb4编码的默认值为utf8mb4_general_ci。

各种后缀的含意:

    ci: Case Insensitive的缩写,即大小写无关. cs: Case Sensitive,大小写敏感。 ai: Accent Insensitive(发音无关),例如e, è, é被视为一样的 bin: Binary, 二进制比较, 大小写敏感的

可以通过命令查看Collation与Charset的对应关系:

SHOW COLLATION;
经验分享 程序员 微信小程序 职场和发展