在 MySQL 中创建数据库时,选择正确的字符集和排序规则是确保数据能正确存储和检索的关键,尤其是需要支持中文和 Emoji 等符号时。
选择规则
对于需要支持中文、Emoji 及多语言符号的现代应用,选择如下:
- 字符集 (Character Set):无脑选择 utf8mb4 。它是 MySQL 中完整的 UTF-8 实现,支持所有 Unicode 字符,包括 4 字节的 Emoji 和生僻字。而历史遗留的 utf8 (实为 utf8mb3 )仅支持 3 字节字符,无法存储 Emoji,不应再使用。
- 排序规则 (Collation):绝大多数场景推荐 utf8mb4_unicode_ci (mysql 小于 8 版本),mysql 8.0+ 选择 utf8mb4_0900_ai_ci 。utf8mb4_unicode_ci 基于 Unicode 标准进行排序和比较,能正确处理多语言混合排序,并且不区分大小写( ci ),适合用户昵称、文章内容等通用字段。如果你的 MySQL 版本是 8.0 或更高,也可以使用更新的 utf8mb4_0900_ai_ci ,它基于 Unicode 9.0.0 标准,排序更符合现代习惯。
-- mysql < 8.0
CREATE DATABASE your_database_name
CHARACTER SET utf8mb4 -- 指定字符集
COLLATE utf8mb4_unicode_ci; -- 指定排序规则
-- mysql >= 8.0
CREATE DATABASE your_database_name
CHARACTER SET utf8mb4 -- 指定字符集
COLLATE utf8mb4_0900_unicode_ci; -- 指定排序规则
注意事项
仅设置数据库字符集是不够的,必须确保整个数据链路一致,否则仍可能出现乱码。
- 表与字段级设置:创建表或字段时,最好也显式指定字符集和排序规则,避免继承服务器可能不合适的默认设置(如 la tin1 )。
CREATE TABLE users (
name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
- 客户端连接配置:应用程序连接数据库时,也必须声明使用 utf8mb4 编码。这通常在连接字符串中设置。
- JDBC 示例: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8mb4
- PHP PDO 示例: new PDO("mysql:host=localhost;dbname=db;charset=utf8mb4", user, pass)
- 修改现有数据库:如果修改已有数据库的字符集,务必先备份数据。直接使用 ALTER DATA BASE 或 ALTER TABL E ... CONVERT TO ... 可能无法正确转换已有数据,稳妥的做法是导出数据、修改结构后再重新导入。