在新建 MySQL 数据库时,选择合适的 字符集(Character Set) 和 排序规则(Collation) 对数据存储、查询和多语言支持至关重要。以下是推荐配置及场景分析:
1. 字符集(Character Set)
推荐选择
utf8mb4
(✅ 绝对首选)
- 原因:
- 完整支持 Unicode(包括 Emoji、生僻字、特殊符号等)。
- MySQL 的
utf8
实际上是阉割版(仅支持 3 字节字符,不兼容 Emoji),而utf8mb4
是真正的 4 字节 UTF-8。
- 适用场景:
- 所有现代 Web 应用(尤其是多语言、国际化项目)。
其他选项(不推荐)
utf8
:历史遗留选项,存在兼容性问题。latin1
:仅支持西欧字符,不适合非拉丁语系(如中文)。
2. 排序规则(Collation)
排序规则决定字符串的比较和排序方式,根据需求选择:
(1) 通用推荐
utf8mb4_unicode_ci
- 基于 Unicode 标准排序,支持多语言(如中文、英文、阿拉伯语混合排序)。
- 不区分大小写(
ci
= case insensitive)。 - 适合大多数场景(如用户昵称、内容存储)。
(2) 需要区分大小写
utf8mb4_bin
- 直接按二进制值比较,区分大小写。
- 适用场景:密码哈希、严格区分大小写的业务逻辑。
(3) 其他常见选项
utf8mb4_general_ci
:旧版排序规则,性能略高但排序准确性不如unicode_ci
(已过时)。utf8mb4_0900_ai_ci
:MySQL 8.0+ 新规则,支持更现代的 Unicode 标准(需确认版本兼容性)。
3. 创建数据库时的 SQL 示例
CREATE DATABASE my_database CHARACTER SET utf8mb4 -- 字符集COLLATE utf8mb4_unicode_ci; -- 排序规则
4. 关键注意事项
- 表字段需显式指定字符集
即使数据库设置了utf8mb4
,表或字段仍需明确指定,避免继承服务器默认配置(可能是latin1
):
CREATE TABLE users (name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
- 连接层配置
确保客户端连接时也使用utf8mb4
(如 JDBC URL 添加参数):
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?useUnicode=true&characterEncoding=utf8mb4
- MySQL 版本要求
utf8mb4
需 MySQL 5.5.3+ 版本。- 如果使用 Emoji,确保字段长度足够(如
VARCHAR(255)
而非VARCHAR(255) CHARSET utf8mb4
)。
5. 为什么不用 utf8_general_ci?
- 过时:对多语言排序不准确(如中文拼音排序错误)。
- 性能差异忽略不计:现代服务器上
unicode_ci
和general_ci
的性能差距可忽略。
总结
- 字符集:无脑选
utf8mb4
。 - 排序规则:
- 默认选
utf8mb4_unicode_ci
(兼顾多语言和兼容性)。 - 严格区分大小写选
utf8mb4_bin
。
此配置能覆盖 99% 的应用场景,避免未来因字符集问题导致的乱码或数据迁移困难!