问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅谈MySQL中utf8和utf8mb4的区别

发布网友 发布时间:2022-04-22 11:11

我来回答

3个回答

热心网友 时间:2023-11-02 17:38

一、区别

1、MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。

2、好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

二、内容描述

1、那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。

2、三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。

3、也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。

4、包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

三、问题根源

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

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

3、Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。

4、那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。

5、当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的*了 utf8 最大长度为 3,比如 CHAR(100) Mysql 会保留 300字节长度。

6、至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。

7、要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。

8、为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。

热心网友 时间:2023-11-02 17:38

一、什么是UTF8MB4

我们在使用PhpMyAdmin管理面板时,可以在首页看到名为“Server connection collation”(服务器连接排序规则)的选项,用来选择所使用的字符集。对于我们常用的UTF8,却有utf8和utf8mb4两种,这是为什么呢?

原来,MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes
4的意思,专门用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也
会不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用utf8也就够了。

二、为什么会有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 存储会多消耗一些空间。

热心网友 时间:2023-11-02 17:39

今天升级phpmyadmin看到默认字符集是 utf8mb4
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在QQ聊天窗口用快捷键切换不了输入法,其他网页浏览可以,求高手 ...在网页上面都可以切换?也重启qq了,电脑也重启了,别说版本问题_百度... 什么时间是蟑螂活动的高峰期? ...场家越多越好~收购价是多少钱一公斤~收购点在哪里 孤儿寡母的意思 封控文件是什么的 什么是迅影AI一键生成视频软件呢? 迅影ai一键生成视频软件好用吗? 贝克诺顿制药有限公司怎么样,浙江李力旅游攻略路线 清媛控油啫喱背景介绍 mysql 如何存储 emoji 怎么将emoji表情存入mysql 浅谈MySQL中utf8和utf8mb4的区别 苹果6splus充电为什么不显示充电已完成? macbookair m1内存频率 macbook Air可以存屏幕图片吗 苹果macbook air 11寸版值得买吗? macbookair2017换硬盘怎么保存原来的的内容 苹果MacBookAir的存储设备 macbookairm1系统内存占用5g 请问MacBook Air中新写的邮件如何保存? MacBook Air闪存 macbook air可以自己加存储吗 请问MAC BOOK AIR的“另存为”这个功能在哪里可以找到? 苹果电脑macbookair怎么扩大内存,要最简单的方法 苹果macbook air 怎么扩充本机内存 光模块的用处是什么? 光模块的分类 懂光模块开发的进 SFP光模块的相关比较 mysql会因为存储emoji表情成为io瓶颈吗 C#查询语句 如何在mysql数据库中鎒moji特殊字符 怎么将emoji表情存入mysql mysql 数据库乱码问题,页面,数据库都是UTF-8 的字符集,为什么INSERT INTO插入后会是乱码呢? 怎么将Emoj表情插入mysql5.6数据库 emoji表情怎么录入mysql 如何将Emoj表情插入mysql5.6数据库 python+mysqldb msyql 数据库中varchar存储多少个emoji表情 java如何处理emoji表情,并存入数据库 如何转义emoji表情,让它可以存入utf8的数据库 数据库mysql 如何保存表情符号 然后返回到前端 商标与商号的区别 商标与商号的区别是什么? 什么是商号?商标和商号有什么区别和联系? 商号和商标的区别包括 什么是商号,商号与商标有什么区别 商号与商标有什么区别? 商标与商号有什么区别? 商标与商号是不是一个概念?