utf8和utf8mb4的区分

MySQL升级utf8mb4:兼容四字节Unicode与宽字符存储
本文介绍了MySQL在5.5.3版本后引入utf8mb4编码的原因,解释了utf8的局限性,以及为何需要utf8mb4来存储Emoji表情和额外的汉字。讨论了Mysql utf8字符集的限制和utf8mb4的兼容性优势,以及如何选择VARCHAR代替CHAR以节省空间。

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

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

(3)问题根源:
        最初的 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。
 

关于字符串长度

中文(包括中文字符)占用3个字节 1个字符
英文(包括英文字符)占用1个字节 1个字符
emoji占用4个字节 1个字符

如果设置varchar(100) 则代表无论中文、英文还是emoji都可以存100个

使用 select 字段,length(字段),char_length(字段) from 表可以测试
其中length(字段)表示占用字节数,char_length表示有几个字符

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则是为了满足数据库系统中对更大字符集的支持需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值