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的默认排序编码。
`utf8mb4_general_ci` `utf8mb4_0900_ai_ci` 是 MySQL 中两种常用的排序规则(collation),它们都属于 `utf8mb4` 字符集,但有显著的区别,主要体现在**排序方式、语言支持、性能 Unicode 支持标准**等方面。 --- ### ✅ 主要区别对比 | 特性 | `utf8mb4_general_ci` | `utf8mb4_0900_ai_ci` | |------|------------------------|------------------------| | **MySQL 版本** | 旧版本默认(MySQL 5.x) | 新版本默认(MySQL 8.0+) | | **排序方式** | 基于字符编码值排序(较简单) | 基于 Unicode 9.0 算法排序 | | **Unicode 支持** | 较旧,不支持 Unicode 5.20+ 的排序规则 | 支持 Unicode 9.0,更准确 | | **大小写敏感** | `ci` 表示不区分大小写 | `ci` 表示不区分大小写 | | **重音敏感** | 不区分重音(如 `à` `a` 被认为相同) | `ai` 表示 **区分重音**(`à` `a` 被认为不同) | | **性能** | 更快,但排序不准确 | 更慢,但排序更符合语言习惯 | | **语言支持** | 通用 | 更适合多语言环境(如德语、法语等) | --- ### ✅ 示例对比 #### 示例1:区分重音 | 字符 | 在 `utf8mb4_general_ci` 下比较 | 在 `utf8mb4_0900_ai_ci` 下比较 | |------|-------------------------------|--------------------------------| | `a` `à` | 相等 | 不等 | | `ö` `o` | 相等 | 不等 | #### 示例2:排序顺序 ```sql SELECT name FROM users ORDER BY name; ``` - `utf8mb4_general_ci`:按 ASCII 值排序,可能不符合语言习惯。 - `utf8mb4_0900_ai_ci`:按语言习惯排序(如德语中 `ä` 排在 `a` 之后)。 --- ### ✅ 如何选择? | 使用场景 | 推荐 collation | |----------|----------------| | 新项目、国际化支持 | `utf8mb4_0900_ai_ci` | | 需要兼容旧系统 | `utf8mb4_general_ci` | | 对排序准确性要求高 | `utf8mb4_0900_ai_ci` | | 对性能要求极高 | `utf8mb4_general_ci` | --- ### ✅ 如何查看当前字段的排序规则? ```sql SHOW FULL COLUMNS FROM your_table; ``` 或者: ```sql SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'your_database' AND TABLE_NAME = 'your_table'; ``` --- ### ✅ 修改字段的排序规则示例: ```sql ALTER TABLE your_table MODIFY your_column VARCHAR(255) COLLATE utf8mb4_0900_ai_ci; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值