utf8mb4

本文探讨了UTF8MB4字符集的引入原因及其与UTF8的区别,特别是在处理四字节Unicode字符如Emoji表情和非常用汉字时的优势。介绍了UTF-8编码原理,并推荐在需要良好兼容性的场景下使用UTF8MB4。

转自:https://blog.youkuaiyun.com/w05980598/article/details/79080381


可以简单的理解 utf8mb4 是目前最大的一个字符编码,支持任意文字.

为什么会有UTF8MB4?

既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。

UTF-8编码

理论上将, UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。关于UTF编码,请阅读《常见编码总结》一文。
而utf8 则是 Mysql 早期版本中支持的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。这可能是因为在MySQL发布初期,基本多文种平面之外的字符确实很少用到。而在MySQL5.5.3版本后,要在 Mysql 中保存 4 字节长度的 UTF-8 字符,就可以使用 utf8mb4 字符集了。例如可以用utf8mb4字符编码直接存储emoj表情,而不是存表情的替换字符。
为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8,事实上,最新版的phpmyadmin默认字符集就是utf8mb4。诚然,对于 CHAR 类型数据,使用utf8mb4 存储会多消耗一些空间。

那么utf8mb4比utf8多了什么的呢?

多了emoji编码支持.

如果实际用途上来看,可以给要用到emoji的库或者说表,设置utf8mb4.

比如评论要支持emoji可以用到.

建议普通表使用utf8 如果这个表需要支持emoji就使用utf8mb4

新建mysql库或者表的时候还有一个排序规则

utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了
如果是utf8mb4那么对应的就是 utf8mb4_general_ci utf8mb4_unicode_ci
 

### UTF8MB3 和 UTF8MB4 字符编码区别 UTF8MB3 是早期版本的 UTF-8 编码实现,在 MySQL 中支持最多三个字节来表示一个字符[^1]。这意味着对于大多数常用字符集,如拉丁字母、西里尔字母和其他常见符号,都能很好地工作。 然而随着互联网的发展以及对更多样化文字的支持需求增加,出现了需要四个字节才能正确存储的表情符号(Emoji)、一些罕用汉字以及其他 Unicode 扩展区中的特殊字符。为此引入了更完整的 UTF8MB4 编码方案,它能够处理多达四字节长度的字符[^2]。 ```sql -- 查看当前数据库默认字符集 SHOW VARIABLES LIKE 'character_set_database'; ``` ### 存储空间差异 由于每个字符可能占用不同数量的字节,因此相同字符串在两种编码方式下的实际存储大小会有所变化: - 对于只包含基本多文种平面 (BMP) 内部字符的数据而言,两者之间几乎没有差别; - 当涉及到辅助平面 (SIP/Astral Planes) 上面定义的一些罕见字符时,则采用 `utf8mb4` 可能会使数据量增大约三分之一左右[^3]。 ```sql -- 创建表并指定不同的字符集 CREATE TABLE test_utf8 ( id INT AUTO_INCREMENT PRIMARY KEY, text_column VARCHAR(255) CHARACTER SET utf8mb3 -- 使用 utf8mb3 ); CREATE TABLE test_utf8mb4 ( id INT AUTO_INCREMENT PRIMARY KEY, text_column VARCHAR(255) CHARACTER SET utf8mb4 -- 使用 utf8mb4 ); ``` ### 性能影响 尽管存在额外的空间开销,但在现代硬件环境下这种差距通常是可以接受甚至忽略不计的;更重要的是选择合适的字符编码可以避免因无法正常显示某些特定字符而导致的应用程序逻辑错误或用户体验问题[^4]。 ### 安全性和兼容性考量 从安全角度来看,使用更为全面和支持最新标准的 `utf8mb4` 能够更好地防止潜在的安全漏洞,比如 SQL 注入攻击中利用未被正确转义或多字节序列解析不当造成的风险。此外,考虑到未来可能出现的新字符加入 Unicode 标准库的情况,提前迁移到 `utf8mb4` 有助于保持系统的长期稳定运行和良好维护性[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值