utf8和utf8mb4的区别

一、简介

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

   二、内容描述

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


   三、问题根源

   最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

   utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。

   Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?我想了一下,可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如 CHAR(100)  Mysql 会保留 300字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。

   要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.  对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR  替代 CHAR。

   引用批注

   [1] 谈谈字符集与字符编码

   http://my.oschina.net/leejun2005/blog/232732#OSC_h3_4

   [2] 关于 MySQL UTF8 编码下生僻字符插入失败/假死问题的分析

   http://my.oschina.net/leejun2005/blog/343353

简单来说数据库若设置为utf8则无法插入4字节的宽字符,还有一些小表情无法保存


原文地址:http://ourmysql.com/archives/1402

UTF-8UTF-8MB4是两种字符编码方案,它们在支持字符集存储方式上有显著的区别。以下是详细的比较: ### 支持的字符集 UTF-8是一种变长的字符编码,它能够表示Unicode标准中的所有1,112,064个有效字符。UTF-8使用一到四个字节来编码一个字符,对于ASCII字符集(即U+0000至U+007F范围内的字符)来说,UTF-8编码与ASCII完全兼容,每个字符仅占用一个字节。 UTF-8MB4则是MySQL数据库系统中对标准UTF-8的一种扩展实现,旨在支持更广泛的字符集,包括那些需要四个字节以上才能表示的特殊字符。例如,某些表情符号(emojis)其他较少使用的象形文字就需要超过三个字节来表示,而这些可以通过UTF-8MB4进行正确编码解码[^2]。 ### 存储效率 由于UTF-8能够使用一到四个字节来表示一个字符,因此它在存储空间上比固定长度的编码更为高效。然而,在MySQL中使用的UTF-8MB4编码特别设计为最多使用四个字节来表示一个字符,这使得它可以存储更多的字符,但同时也可能导致相对于标准UTF-8更高的存储需求。 ### 应用场景 在实际应用中,标准UTF-8广泛应用于互联网现代软件开发中,因为它提供了良好的兼容性广泛的字符支持。而UTF-8MB4主要用于特定的数据库环境中,尤其是当需要处理包含四字节字符的数据时,比如在社交媒体平台上处理用户输入的表情符号。 ### 示例代码 以下是一个简单的Python示例,展示如何将字符串从UTF-8编码转换为UTF-8MB4编码(这里假设有一个环境支持这样的转换,实际上这种转换通常发生在数据库层面): ```python # 假设字符串s是UTF-8编码 s = "Hello, world! 😊" # 在Python中,字符串默认是Unicode,所以我们可以直接编码为UTF-8 utf8_bytes = s.encode('utf-8') # 对于UTF-8MB4,通常这是在数据库配置中设置的,而不是直接在Python中处理 # 但是为了演示,我们假设UTF-8MB4在这里等同于UTF-8,并执行相同的编码操作 utf8mb4_bytes = s.encode('utf-8') # 实际上,在MySQL之外,这仍然是标准的UTF-8编码 # 输出编码后的结果 print("UTF-8 Encoded:", utf8_bytes) print("UTF-8MB4 Encoded:", utf8mb4_bytes) ``` 请注意,上述代码中的UTF-8MB4编码步骤实际上并没有真正的区别,因为Python的`str.encode()`方法并不区分UTF-8UTF-8MB4。真正的区别在于数据库或特定系统的实现。 ### 总结 尽管UTF-8UTF-8MB4听起来相似,但它们各自服务于不同的目的。标准UTF-8适用于大多数网络文本处理任务,而UTF-8MB4则是为了满足数据库系统中对更大字符集的支持需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值