Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中utf8mb4和utf8字符集之间的区别是什么?_Mysql_Encoding_Utf 8_Character Encoding_Utf8mb4 - Fatal编程技术网

MySQL中utf8mb4和utf8字符集之间的区别是什么?

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”不能

MySQL中的
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)的一本好书也可以对此有所启发

摘自:

  • utf8mb4
    :使用一对一的Unicode字符集的UTF-8编码 每个字符有四个字节

  • utf8mb3
    :使用一对一的Unicode字符集的UTF-8编码 每个字符三个字节

在MySQL中,
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

  • utf8
    是MySQL较早的、有缺陷的UTF-8实现,目前正在被弃用
  • utf8mb4
    是他们命名的固定UTF-8实现,也是您现在应该使用的
在有缺陷的版本中,只有第一个64k字符平面(基本的多语言平面)中的字符可以工作,其他字符被认为无效。该平面内的代码点值-0到65535(其中一些是出于特殊原因保留的)可以用UTF-8中最多3个字节的多字节编码表示,MySQL早期版本的UTF-8任意决定将其设置为限制。这一限制在任何时候都不是UTF-8规则的正确解释,因为UTF-8在任何时候都没有定义为每个字符最多只允许3个字节。事实上,UTF-8的最早定义将其定义为最多有6个字节(自修订后为4个字节)。MySQL的原始版本总是被任意破坏

当MySQL发布此版本时,此限制的结果并不太糟糕,因为大多数Unicode字符都在第一个平面中。从那时起,越来越多新定义的字符范围被添加到Unicode中,其值位于第一个平面之外。Unicode本身定义了17个平面,尽管到目前为止只使用了其中的7个

为了避免在做出任何特定假设时破坏旧代码,MySQL保留了被破坏的实现,并调用了更新的固定版本
utf8mb4
。这导致了一些混乱
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;