MySQL如何选择utf8mb4_general_ci和utf8mb4_0900_ai_ci字符集排序规则
正式生产环境本着稳定高于一切的宗旨,所以也就不太可能做到数据库方面的升级保持,在 MySQL 8.0 版本之前 utf8mb4_general_ci 是默认的排序规则。而在从 MySQL 8.0 开始,默认排序规则已经更改为 utf8mb4_0900_ai_ci。既然 MySQL 默认都变更了,这也就意味着新项目的开发中理论上也应该如此的应用,所以下面就和子凡我来知其所以然。
排序准确性
utf8mb4_general_ci:这个排序规则并没有完全实现 Unicode 的排序规则。因此,在处理某些特殊语言或字符集时,排序结果可能会出现不一致的情况。然而,在大多数情况下,这种不一致性可能并不会对结果产生显著影响,因为许多特殊字符的顺序并不需要非常精确。
utf8mb4_0900_ai_ci:这个排序规则是基于 Unicode 9.0 的规范,并且具有“不区分音调”(accent insensitivity)和“不区分大小写”(case insensitivity)的特性。这意味着它能够更准确地处理各种语言之间的排序问题,包括那些涉及特殊字符和音调的语言。
性能
utf8mb4_general_ci:由于它没有实现复杂的 Unicode 排序规则,因此在比较和排序时通常更快。
utf8mb4_0900_ai_ci:为了实现更准确的排序,它可能使用了稍微复杂的排序算法。然而,在大多数情况下,这种性能差异可能并不明显。
简单总结
utf8mb4_0900_ai_ci 提供了更准确的排序功能,特别是在处理涉及多种语言和特殊字符集的情况时。如果性能是一个关键因素,并且不需要非常精确的排序结果,那么 utf8mb4_general_ci 可能是一个更好的选择。所以在选择适当的排序规则时,还是需要根据具体需求和数据库环境进行权衡。
当然其实既然都用上 MySQL 8.x 版本了,本身从性能上来说就会比 MySQL 5.7 及之前的老版本有较大的性能提升,单从使用需求上来说,只要涉及到检索肯定还是希望有更精准的排序结果,不然搜索的意义又在哪里呢?所以子凡我个人更倾向于使用和推荐 utf8mb4_0900_ai_ci。
作者:张子凡