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的默认排序编码。
相关推荐
茉莉玫瑰花茶5 分钟前
综合案例 - AI 智能租房助手 [ 5 ]
服务器·数据库·人工智能·python·ai
ywl4708120876 分钟前
jwt生产token,简单版helloworld
java·数据库·spring
器灵科技19 分钟前
AI视频工具实测:Seedance/可灵/HappyHorse谁最能打?
java·运维·数据库·人工智能·github
huangdong_42 分钟前
京东商品图片视频批量下载与m3u8视频合并技术完整实现方案
大数据·前端·数据库
倒流时光三十年1 小时前
PostgreSQL CASE 条件表达式详解
数据库·postgresql
字节跳动数据平台1 小时前
营销视频进入工业化时代,火山引擎多模态数据湖如何助力多米实现内容生产提效 100+ 倍
数据库
健康平安的活着2 小时前
mysql中数据库脚本太大,通过脚本命令修改db名称
数据库·mysql
倒流时光三十年2 小时前
PostgreSQL COALESCE 条件表达式函数详解
数据库·postgresql
让我上个超影吧2 小时前
Claude code:Hooks
java·数据库·ai编程
RH2312112 小时前
2026.6.8Linux
java·数据库·中间件