一、字符集utf8mb4和utf8
在MySQL中,字符集utf8mb4和utf8(实际为utf8mb3)的主要区别在于编码范围、存储空间、兼容性以及应用场景。以下是两者的具体对比:
1. 编码范围
utf8(utf8mb3): 仅支持基本多语言平面(BMP)的字符,即Unicode码点范围为U+0000到U+FFFF。 无法存储需要4字节编码的字符,例如部分表情符号(Emoji)、罕见汉字、新增Unicode字符等。 utf8mb4: 支持完整的Unicode字符集,包括所有17个平面,码点范围为U+0000到U+10FFFF。 可以存储Emoji、罕见汉字、古代文字等特殊字符。
2. 存储空间
utf8(utf8mb3):
- 每个字符使用1-3字节编码。
- 存储常见字符(如英文、中文)时空间效率较高。
utf8mb4:
- 每个字符使用1-4字节编码。
- 存储4字节字符(如Emoji)时占用更多空间。例如: CHAR(10)字段在utf8下需预留103=30字节。 在utf8mb4下需预留104=40字节。
3. 兼容性
utf8(utf8mb3):
- 兼容性更广,几乎所有系统和编程语言均支持。
- 适合与其他系统(尤其是旧系统)交换数据。
utf8mb4:
- 需要MySQL 5.5.3及以上版本支持。
- 应用程序和数据库驱动需明确支持utf8mb4,否则可能报错或乱码。
4. 应用场景
优先选utf8(utf8mb3): 仅存储英文、中文等常见字符。 对存储空间敏感,或需兼容旧系统。 优先选utf8mb4: 存储用户生成内容(如评论、社交动态),可能包含Emoji或特殊符号。 开发国际化应用,需支持多语言和罕见字符。 未来扩展性强,避免后续字符集升级麻烦。
5. 排序规则(Collation)差异
utf8_general_ci: 比较字符串时不区分大小写和重音,但仅支持BMP字符。 utf8mb4_unicode_ci: 基于Unicode标准排序,支持所有字符,准确性更高。 例如:在utf8mb4_unicode_ci下,a和A的比较更符合语言习惯。
6. 安全性
utf8(utf8mb3): 存在潜在安全风险,如UTF-8编码注入攻击(利用4字节字符拆分绕过安全检查)。
utf8mb4: 严格校验4字节字符,可防止此类攻击。
设置建议 新建数据库/表时: CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE mytable ( id INT PRIMARY KEY, content TEXT ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
连接字符串中指定字符集(以JDBC为例): jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8mb4
总结
建议优先使用utf8mb4,除非明确只需存储BMP字符且需极致压缩空间。