php

MYSQL(8.0版本及以上)- utf8mb3,utf8mb4 和utf8的含义和由来

2023-07-30

首先,上结论:

国际上的UTF-8,在MySQL中,对标的是uft8mb4。

在MySQL中,实际只有utf8mb4和utf8mb3。至于uft8,在 V8.0 还是指代的utf8mb3,未来的会变为uft8mb4。

译者注:mb3 maximun of 3 bytes per multibyte character.

国际上的UTF-8简介
Java Unicode编码 及 Mysql utf8 utf8mb3 utf8mb4 的区别与utf8mb4的过滤

UTF-8(8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容——这使得原来处理ASCII字符的软件无须或只须做少部分修改 即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或发送文字的应用中,优先采用的编码。

UTF-8使用1~4个字节为每个字符编码(2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节):

128个US-ASCII字符只需1个字节编码(Unicode范围由U+0000至U+007F)。

带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要2个字节编码(Unicode范围由U+0080至U+07FF)。

基本多文种平面/BMP, Basic Multilingual Plane:字符(这包含了大部分常用字,例如CJVK常用字字符集 —— Chinese, Japanese, Vietnam, Korean)使用3个字节编码(Unicode范围由U+0800至U+FFFF)。

Unicode 辅助平面/Supplementary Multilingual Plane:使用极少,字符使用4个字节编码(Unicode范围由U+10000至U+10FFFF,主要包括不常用的CJK字符, 数学符号, emoji表情等)。

具体来讲是这样的:

uft8mb3:

支持&仅且支持BMP characters(不支持supplementary characters)

每个multibyte-character,都不多于3个bytes

uft8mb4:

要想支持BMP characters + supplementary characters,既国际上的UTF-8/(4bytes),用uft8mb4(见官方文档 Section 10.9.1, “The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)”)

(MySQL的)utf8是utf8mb3的别名:

MySQL里,utf8的(命名)是隐式的,等价于utf8mb3,但是但从名称上是看不出最大字符数的。

好消息是MySQL在未来会改正uft8的命名:“在未来的MySQL版本中会删除utf8mb3,请改用utf8mb4。虽然utf8目前是utf8mb3的别名,但在未来某个时候,utf8将指代utf8mb4。为了避免对utf8的含义产生歧义,可以考虑直接把字符集引用指定为utf8mb4,而不是utf8。”