MySQL编码细节问题:utf8、utf8mb4、utf8mb4_general_ci、utf8mb4_0900_ai_ci

问题

还记得第一次创建的mysql数据库编码格式是什么?

大多数人创建的都是Utf-8格式的,但是到了工作中,创建的数据库格式用的都是utf8mb4格式,同时还带一个排序编码utf8mb4_general_ci。这些看着很类似的名词有什么关系呢?

定义

  • 标准的UTF-8字符集编码:是可以使用1-4个字节去编码21位字符,这几乎包含了世界上所有能看见的语言。
  • MySQL实现的utf8:最长使用3个字符,包含了大多数字符但并不是所有。例如emoji和一些不常用的汉字,如"墅",这些需要四个字节才能编码的就不支持
  • utf8mb4(utf8 most bytes 4 ):Utf8最大字节数4,MySQL 5.5.3之后增加了utfmb4字符编码,支持BMP(Basic Multilingual Plane,基本多文种平面)和补充字符,最多使用四个字节存储字符。
  • 排序字符集:utf8mb4对应的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci(MySQL 8.0 前的默认排序字符集)、utf8mb4_0900_ai_ci(MySQL 8.0 后的默认排序字符集)
    • utf8mb4_unicode_ci:是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
    • utf8mb4_general_ci:这个排序规则并没有完全实现 Unicode 的排序规则。因此,在处理某些特殊语言或字符集时,排序结果可能会出现不一致的情况。然而,在大多数情况下,这种不一致性可能并不会对结果产生显著影响,因为许多特殊字符的顺序并不需要非常精确。
    • utf8mb4_0900_ai_ci:这个排序规则是基于 Unicode 9.0 的规范,并且具有"不区分音调"(accent insensitivity)和"不区分大小写"(case insensitivity)的特性。这意味着它能够更准确地处理各种语言之间的排序问题,包括那些涉及特殊字符和音调的语言。

实际应用

首先是根据实际业务场景和mysql版本

  • 如果业务是在初始架构阶段,mysql选择使用MySQL 8.,本身从性能上来说就会比 MySQL 5.7 及之前的老版本有较大的性能提升,那直接使用utf8mb4_0900_ai_ci,同时还有更精准的排序结果。
  • 如果业务之前用的MySQL 5.7 到MySQL 8.之间的版本,使用的utf8mb4_general_ci,存在大量的数据和SQL函数,在做MySQL8适配的时候还是选择utf8mb4_general_ci,不然会出现SQL函数异常,编码转换的问题。
  • 在绝大多数情况下,这些特殊字符的顺序并不需要那么精确,utf8mb4_general_ci在比较和排序的时候更快,故utf8mb4_general_ci是在Mysql8之前作为utf8mb4的默认排序编码。
相关推荐
PGCCC11 分钟前
【PGCCC】postgresql 缓存池并发设计
数据库·缓存·postgresql
小爬虫程序猿18 分钟前
如何利用Python解析API返回的数据结构?
数据结构·数据库·python
wowocpp1 小时前
查看 磁盘文件系统格式 linux ubuntu blkid ext4
linux·数据库·ubuntu
C吴新科4 小时前
MySQL入门操作详解
mysql
Ai 编码助手7 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员7 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle7 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻7 小时前
MySQL排序查询
数据库·mysql
萧鼎7 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^7 小时前
数据库连接池的创建
java·开发语言·数据库