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的默认排序编码。
相关推荐
Irene1991几秒前
(AI总结版)SQL Developer 安装好了,Oracle 21c XE 数据库已连接,之后的操作:搭建大数据开发的基础环境
数据库·oracle
qq_43270366几秒前
HTML函数运行吃CPU吗_HTML函数对处理器性能影响评估【教程】
jvm·数据库·python
weixin_458580126 分钟前
php怎么处理跨域请求_php如何设置header解决跨域问题详解
jvm·数据库·python
m0_734949798 分钟前
CSS 背景图片无法加载的常见原因与正确写法详解
jvm·数据库·python
2301_815279529 分钟前
mysql如何使用yum安装mysql_配置官方yum源与自动安装
jvm·数据库·python
档案宝档案管理13 分钟前
智慧档案管理系统是什么?档案宝功能深度解析
大数据·数据库·人工智能·档案管理
weixin_4585801213 分钟前
MySQL跨版本迁移数据格式不兼容_使用mysqldump全量导出导入
jvm·数据库·python
绩隐金15 分钟前
SQL Server 性能优化实战(第七期):内存架构——缓冲池、计划缓存与内存配置
数据库
Greyson116 分钟前
SQL触发器在导入大文件时如何跳过_使用禁用触发器语句导入
jvm·数据库·python
2401_8877245019 分钟前
Redis怎样统计独立访客UV_基于Set的SADD指令天然去重特性
jvm·数据库·python