先执行下面的 SQL,然后导出生成的 SQL 语句到text 文件;
再从 txt 文件中复制 SQL 到数据库,再执行一遍;
SELECT
CONCAT( 'ALTER TABLE ',TABLE_NAME,' CONVERT TO CHARACTER SET utf8mb4 collate utf8mb4_general_ci;')
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME;
这个 SQL 是把数据库所有表的字符编码及字符集改为 utf8mb4 - utf8mb4_general_ci;
可根据需求,调整这两个参数;
1. MySQL 常用字符集简介
- 字符集(Character Set)
指定了数据库字符串字段可以存储哪些字符。例如
utf8、utf8mb4。
- 排序规则(Collation)
决定了字符串如何比较和排序。常见的后缀有
_general_ci、_unicode_ci、_bin,等。
2. 排序规则对比
2.1 _general_ci 和 _unicode_ci
举例:
utf8_general_ci(效率高,但不完全准确)
utf8_unicode_ci(准确遵循 Unicode,推荐需要国际化支持时用)
2.2 _bin
- bin(Binary,二进制比对)
- 语义:完全基于字符的二进制值进行比较和排序,区分大小写和字符编码的所有细节。
- 适用场景:需要精准区分字符差异、存储密钥、做唯一性约束或对大小写敏感的场合。
- 注意事项:排序、人类语义性较差,比如 'a' 和 'A' 视为不同字符。
3. 字符集对比
3.1 utf8 vs utf8mb4
-
utf8
- 最多支持 3 字节编码。不能存储 4 字节 Unicode 字符(如 Emoji、部分生僻汉字)。
- 适用场景:不涉及 Emoji 或 4 字节字符时可用。
- 已被标注为“不完全的 UTF-8 实现”,新版 MySQL 官方建议避免新应用选择它。
-
utf8mb4
- 真正的 UTF-8 实现,支持 1~4 字节所有 Unicode 字符。
- 能存储 Emoji、高Unicode码点汉字等字符。
- 适用场景:推荐所有新项目或需要兼容 Emoji、多语言内容时使用。
4. 推荐使用场景
| 应用需求 |
字符集/排序规则 |
说明 |
| 仅英文、简单多语言 |
utf8_general_ci |
性能高,适用简单场景。 |
| 国际化(需严格多语种支持) |
utf8_unicode_ci |
精确、强大,推荐多语种要支持的场合。 |
| 需要 Emoji、所有 Unicode |
utf8mb4_unicode_ci |
推荐现代应用的默认选择,完全支持最新字符内容。 |
| 对大小写、字节码严格辨别 |
utf8mb4_bin |
密钥、token、对比严格场合使用。 |
| 新项目强烈建议 |
utf8mb4_unicode_ci |
官方推荐,兼容所有需求。 |
5. 总结建议
- 新建表/数据库尽量指定 utf8mb4 设置,并选用合适的 Collation(如 utf8mb4_unicode_ci 或 utf8mb4_bin)。
- 遇到 Emoji 存储问题,多半是使用了 utf8 而非 utf8mb4。
- 需要高效简单查询可用 general_ci,语言复杂建议选 unicode_ci。
- 需要严格比对的(如密码、唯一键)可用 bin 排序规则。
6. 示例
-- 推荐设置:
CREATE DATABASE dbname DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
参考文档