MySQL 中的 utf8 与 utf8mb4
- MySQL 支持的 utf8 编码最大字符长度为 3 字节
- MySQL utf8 编码中,4 字节的宽字符会插入异常,例如一些不常用的汉字
- MySQL 5.5.3 版本以后支持 utf8mb4
- utf8mb4 是 utf8 的超集,从旧版本的 MySQL utf8 升级数据为 utf8mb4 时, 不用担心字符转换或丢失数据
utf8mb4_unicode_ci 与 utf8mb4_general_ci
- MySQL 8.0 以前 utf8mb4_general_ci 是默认排序规则
- 对中文、英文来说没有实质差别,用 utf8_general_ci 就可以
- utf8mb4_unicode_ci 在特殊情况下,Unicode 排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法
- utf8mb4_general_ci 比对速度快,但准确度稍差
- 如果应用有德语、法语或者俄语,一定使用 utf8_unicode_ci
utf8mb4_0900_ai_ci
- MySQL 8.0.1 及更高版本中默认使用,属于 utf8mb4_unicode_ci 中的一种
- 0900 指的是 Unicode 校对算法版本
- ai 指口音不敏感,例如排序时 e,è,é,ê 和 ë 之间没有区别
- ci 表示不区分大小写,例如排序时 p 和 P 之间没有区别
- 如果需要口音敏感和区分大小写,可以使用 utf8mb4_0900_as_cs
- 可以存储表情符号,Emoji 占用四个字节
总结
- 新项目尽量使用 utf8mb4 兼容多种语言的字符,例如 utf8mb4_general_ci
- MySQL 8.0 之前的版本,如果项目可能包含其他语言,一定使用 utf8mb4_unicode_ci
- MySQL 8.0 之后的版本,一般使用默认的 utf8mb4_0900_ai_ci 即可
- 在使用 utf8mb4 时,使用 varchar 替换 char 能节省空间( char 采用固定长度的存储方式)
参考:
Character Sets and Collations in MySQL
MySQL 几种编码格式的区别
全面了解 mysql 中 utf8 和 utf8mb4 的区别