前言:
我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 ,除此之外,MySQL 8.0 下的字符集和比较规则还有没有其他变化呢?本篇文章我们一起来学习下。
utf8mb4 字符集
在 MySQL 8.0 中,utf8mb4 字符集是默认的字符集设置,它是一个真正的 4 字节 UTF-8 编码,能够存储任何 Unicode 字符,包括表情符号、特殊符号以及其他复杂的文字。
utf8mb4 的使用场景包括但不限于:
- 存储超出 utf8mb3 范围的字符,如某些不常用的汉字和新增的 Unicode 字符。
- 存储 emoji 表情,这些表情需要四字节的编码。
- 确保数据库能够支持国际化应用,处理各种语言和特殊字符 。
utf8mb4 是 utf8 的超集,完全兼容它,并且理论上将原有的 utf8(实际上是 utf8mb3)修改为 utf8mb4 不会对已有的数据产生问题。
utf8mb4_0900_ai_ci 比较规则
MySQL 8.0 版本下,utf8mb4 默认的比较规则是 utf8mb4_0900_ai_ci ,而 MySQL 5.7 utf8mb4 默认的比较规则是 utf8mb4_general_ci ,下面我们一起来看下 utf8mb4 字符集下的比较规则。
以上对比可以看出 MySQL 8.0 版本 utf8mb4 字符集下的比较规则多达 89 种,而 MySQL 5.7 只有 26 种,少的 63 种都是带 0900 标识的。并且 MySQL 8.0 版本 utf8mb4 字符集默认的比较规则utf8mb4_0900_ai_ci 在 5.7 版本中是不存在的。
查阅官方文档得知,0900 标识符的比较规则是在 MySQL 8.0 版本中引入的,是基于 Unicode Collation Algorithm (UCA) 9.0.0 标准的比较规则,能提供更精确、更现代的 Unicode 支持。
其余标识符就是比较常见的了,ci(case-insensitive):不区分大小写,cs(case-sensitive):区分大小写,ai(accent-insensitive):不区分重音符号,as(accent-sensitive):区分重音符号。
utf8mb4_0900_ai_ci 比较规则不区分大小写且不区分重音符号,遵循更新版的 Unicode 标准,更好地支持了国际化和多语言环境。MySQL 8.0 建议采用此比较规则,它可以看作是 utf8mb4_general_ci 的升级版,二者之间区别很小,在 8.0 版本下的区别之一是:utf8mb4_0900_ai_ci 不忽略末尾空格,而 utf8mb4_general_ci 忽略末尾空格,即 'abc ’ 和 ‘abc’ 在 utf8mb4_0900_ai_ci 比较规则下认为是不相等的,而在 utf8mb4_general_ci 下是相等的。
总结:
本篇文章介绍了 MySQL 8.0 版本中 utf8mb4 字符集及其比较规则,建议 8.0 版本保持默认即可。如果你的数据库是由 5.7 版本升级或迁移来的,建议保持使用原先的 utf8mb4_general_ci 字符集。不过需要注意的是,因 MySQL 5.7 没有 utf8mb4_0900_ai_ci 比较规则,若有库表使用此比较规则来导入 5.7 版本,则会报错无法执行。