MySQL中utf8mb4和utf8字符集之间的区别是什么?
MySQL中的MySQL中utf8mb4和utf8字符集之间的区别是什么?,mysql,encoding,utf-8,character-encoding,utf8mb4,Mysql,Encoding,Utf 8,Character Encoding,Utf8mb4,MySQL中的utf8mb4和utf8字符集之间有什么区别 我已经知道ASCII、UTF-8、UTF-16和UTF-32编码; 但是我很想知道utf8mb4编码组与MySQL服务器中定义的其他编码类型有什么区别 使用utf8mb4而不是utf8有什么特别的好处/建议吗?是一种可变长度编码。在UTF-8的情况下,这意味着存储一个代码点需要一到四个字节。然而,MySQL的编码称为“utf8”(别名为“utf8mb3”),每个代码点最多只能存储三个字节 因此,字符集“utf8”/“utf8mb3”不能
utf8mb4
和utf8
字符集之间有什么区别
我已经知道ASCII、UTF-8、UTF-16和UTF-32编码;
但是我很想知道utf8mb4
编码组与MySQL服务器中定义的其他编码类型有什么区别
使用utf8mb4
而不是utf8
有什么特别的好处/建议吗?是一种可变长度编码。在UTF-8的情况下,这意味着存储一个代码点需要一到四个字节。然而,MySQL的编码称为“utf8”(别名为“utf8mb3”),每个代码点最多只能存储三个字节
因此,字符集“utf8”/“utf8mb3”不能存储所有Unicode代码点:它只支持0x000到0xFFFF的范围,称为“”。
另见
这是(上一版本的同一页)对此的看法:
名为utf8[/utf8mb3]的字符集每个字符最多使用三个字节,并且仅包含BMP字符。从MySQL 5.5.3开始,utf8mb4字符集每个字符最多使用四个字节,支持补充字符:
- 对于BMP字符,utf8[/utf8mb3]和utf8mb4具有相同的存储特性:相同的代码值、相同的编码、相同的长度
- 对于补充字符,utf8[/utf8mb3]根本无法存储该字符,而utf8mb4需要四个字节来存储该字符。由于utf8[/utf8mb3]根本无法存储字符,因此在utf8[/utf8mb3]列中没有任何补充字符,并且在从较旧版本的MySQL升级utf8[/utf8mb3]数据时,不必担心转换字符或丢失数据
因此,如果您希望您的列支持存储位于BMP之外的字符(您通常希望),例如,使用“utf8mb4”。另请参见。utf8mb4字符集非常有用,因为现在我们不仅需要支持存储语言字符,还需要支持存储符号、新引入的表情符号等 马蒂亚斯·拜恩斯(Mathias Bynens)的一本好书也可以对此有所启发 摘自:
:使用一对一的Unicode字符集的UTF-8编码 每个字符有四个字节utf8mb4
:使用一对一的Unicode字符集的UTF-8编码 每个字符三个字节utf8mb3
utf8
目前是utf8mb3
的别名,已被弃用,并将在未来的MySQL版本中删除。此时utf8
将成为对utf8mb4
的引用
因此,不管这个别名是什么,您都可以有意识地为自己设置utf8mb4
编码
为了完成回答,我想在下面添加@WilliamEntriken的评论(也摘自手册):
<>为了避免<代码> UTF8意义的歧义,考虑明确指定<代码> UTF8Mb4< /COD>字符集引用,而不是<代码> UTF8
MySQL在5.5.3之后添加了这个utf8mb4代码,Mb4是最字节4的意思,专门设计为与四字节Unicode兼容。幸运的是,UTF8MB4是UTF8的超集,只是不需要将编码转换为UTF8MB4。当然,为了节省空间,一般使用UTF8就足够了 原始UTF-8格式使用1到6个字节,最多可编码31个字符。最新的UTF-8规范仅使用一到四个字节,最多可编码21位,仅代表所有17个Unicode平面。UTF8是Mysql中的一个字符集,最多只支持三个字节的UTF-8字符,这是Unicode中的基本多文本平面 要在Mysql中保存4字节长的UTF-8字符,您需要使用UTF8MB4字符集,但仅使用5.5。支持3个版本后(查看版本:选择版本();)。我认为为了获得更好的兼容性,您应该始终使用UTF8MB4而不是UTF8。对于char类型的数据,UTF8MB4消耗更多的空间,并且根据Mysql的官方建议,使用VARCHAR代替char 在MariaDB中,当未在服务器配置中显式设置utf8mb4时,将其作为默认字符集,因此使用COLLATE utf8mb4\u unicode\u ci
是MySQL较早的、有缺陷的UTF-8实现,目前正在被弃用utf8
是他们命名的固定UTF-8实现,也是您现在应该使用的utf8mb4
utf8mb4
。这导致了一些混乱
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;