第 42.1 节:选择哪种 CHARACTER SET 和 COLLATION?

有几十种字符集和数百种排序规则。(一个给定的排序规则只属于一个字符集。)查看 SHOW COLLATION; 的输出。

通常只有 4 种 CHARACTER SET 比较重要:

  • ascii —— 基本的 7 位编码。
  • latin1 —— ascii,加上西欧语言所需的大多数字符。
  • utf8 —— utf8 的 1、2、3 字节子集。这不包括 Emoji 和部分中文字符。
  • utf8mb4 —— UTF8 字符的完整集合,覆盖当前所有语言。

所有以上都包含英文字符,编码相同。utf8 是 utf8mb4 的子集。

最佳实践:

  • 对于可能包含多种语言的 TEXT 或 VARCHAR 列,使用 utf8mb4。
  • 对于十六进制字符串(UUID、MD5 等)和简单编码(country_code、postal_code 等),使用 ascii(latin1 也可以)。

utf8mb4 直到 5.5.3 版本才出现,在此之前 utf8 是可用的最佳选择。

在 MySQL 之外,“UTF8” 的含义与 MySQL 的 utf8mb4 相同,而不是 MySQL 的 utf8。

排序规则名称以字符集名称开头,通常以 _ci(大小写和重音不敏感)或 _bin(仅比较位)结尾。

最新的 utf8mb4 排序规则是 utf8mb4_unicode_520_ci,基于 Unicode 5.20。如果你使用单一语言,可能需要类似 utf8mb4_polish_ci 的排序规则,它会根据波兰语惯例稍微重新排列字母。

第 42.2 节:在表和字段上设置字符集

你可以使用 CHARACTER SET 语句为表和单个字段设置字符集:

CREATE TABLE Address (
    AddressID INTEGER NOT NULL PRIMARY KEY,
    Street VARCHAR(80) CHARACTER SET ASCII,
    City VARCHAR(80),
    Country VARCHAR(80) DEFAULT "United States",
    Active BOOLEAN DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

City 和 Country 将使用 UTF8,因为我们将其设置为表的默认字符集。而 Street 将使用 ASCII,因为我们专门指定了它。

设置正确的字符集高度依赖于你的数据集,但也可以大大提高系统间处理数据的可移植性。

第 42.3 节:声明

CREATE TABLE foo (
    ...
    name CHARACTER SET utf8mb4
);

第 42.4 节:连接

使用字符集的关键是告诉 MySQL 服务器客户端的字节使用什么编码。一种方法是:

SET NAMES utf8mb4;

每种语言(PHP、Python、Java 等)都有自己的方式,但通常优先使用 SET NAMES。

例如:SET NAMES utf8mb4,加上声明为 CHARACTER SET latin1 的列 —— 这将在 INSERT 时从 latin1 转换为 utf8mb4,并在 SELECT 时转换回来。