Mysql---utf8、utf8mb4、utf8mb4_unicode_ci、utf8mb4_general_ci区别

本文详细解析MySQL的utf8mb4编码,对比utf8,解释其如何支持四字节Unicode,以及utf8mb4_unicode_ci与utf8mb4_general_ci排序规则的区别,帮助理解不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。   utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。

那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

2.字符集、连接字符集、排序字符集

utf8mb4对应的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci.

utf8mb4_unicode_ci和utf8mb4_general_ci的对比:

  1. 准确性:
    • utf8mb4_unicode_ci是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
    • utf8mb4_general_ci没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。
    • 但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
  2. 性能
    • utf8mb4_general_ci在比较和排序的时候更快
    • utf8mb4_unicode_ci在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
    • 但是在绝大多数情况下发,不会发生此类复杂比较。相比选择哪一种collation,使用者更应该关心字符集与排序规则在db里需要统一。

总而言之,utf8mb4_general_ci 和utf8mb4_unicode_ci 是我们最常使用的排序规则。utf8mb4_unicode_ci 校对速度快,但准确度稍差。utf8_unicode_ci准确度高,但校对速度稍慢,两者都不区分大小写。这两个选哪个视自己情况而定,还是那句话尽可能保持db中的字符集和排序规则的统计。

### UTF8MB4_UNICODE_CIUTF8MB4_GENERAL_CI 的差异 在 MySQL 中,`utf8mb4_unicode_ci` 和 `utf8mb4_general_ci` 是两种不同的排序规则(collation),用于处理字符集 `utf8mb4` 下字符串的比较和排序。 #### 字符串比较准确性 `utf8mb4_unicode_ci` 排序规则基于 Unicode 标准实现更严格的语言敏感性。这种排序方式考虑到了更多复杂的语言特性,如重音符号、变音符号和其他特殊字符的区别[^1]。因此,在多语言环境中特别是对于欧洲语言的支持更为精准。 相比之下,`utf8mb4_general_ci` 则采用了较为宽松的方式来进行字符匹配与排序操作。它忽略了某些细节上的差别,比如不同形式的字母可能被视为相同对待;这使得其性能通常优于前者但在特定情况下可能会丢失一些细微的语言特征[^2]。 #### 性能表现 由于 `utf8mb4_unicode_ci` 需要执行更加细致入微的文字分析工作来确保正确无误地识别各种文字形态及其含义关联,所以在实际应用过程中往往伴随着更高的计算成本以及相对较慢的速度体验。而另一方面,`utf8mb4_general_ci` 因为其简化了部分逻辑判断流程从而获得了更好的效率优势[^3]。 ```sql SELECT 'é' = 'e' COLLATE utf8mb4_unicode_ci AS unicode_result, 'é' = 'e' COLLATE utf8mb4_general_ci AS general_result; ``` 上述 SQL 查询展示了两个排序规则下对带重音符号的小写字母 "é" 与普通小写英文字母 "e" 进行相等性测试的结果对比情况: - 使用 `utf8mb4_unicode_ci` 返回 false 表明两者并不认为是相同的; - 而采用 `utf8mb4_general_ci` 则会返回 true 认定它们可以互换使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值