第 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 时转换回来。