В чем разница между кодировками utf8mb4 и utf8 в MySQL?
========================================================

 В чем разница между `utf8mb4` и `utf8` в MySQL?

  Я уже знаю о кодировках ASCII, UTF-8, UTF-16 и UTF-32; но мне любопытно узнать, в чем отличие группы кодировок `utf8mb4` от других типов кодирования, определенных в MySQL Server.

  **Есть ли какие-то особые преимущества/предложения использования `utf8mb4` а не `utf8`?**

 

 [UTF-8](https://en.wikipedia.org/wiki/UTF-8) - кодировка переменной длины. В случае UTF-8 это означает, что для хранения одной кодовой точки требуется от одного до четырех байтов. Однако в кодировке MySQL с именем utf8 (псевдоним utf8mb3) хранится не более трех байтов на кодовую точку.

  Поэтому набор символов "utf8"/"utf8mb3" не может хранить все кодовые точки Unicode: он поддерживает только диапазон от 0x000 до 0xFFFF, который называется " [Базовая многоязычная плоскость](http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane%23Basic_Multilingual_Plane) ". Смотрите также [Сравнение кодировок Unicode](http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings#In_detail%23In_detail).

  Вот что (предыдущая версия той же страницы в) [документации MySQL](https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html) должно сказать об этом:

 .i1a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i1a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i1a { width: 468px; height: 60px; } }
 @media(min-width: 1083px) { .i1a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});

>   Набор символов с именем utf8 [/utf8mb3] использует максимум три байта на символ и содержит только символы BMP. Начиная с MySQL 5.5.3, набор символов utf8mb4 использует максимум четыре байта на символ, поддерживает дополнительные символы:
> 
>  * Для символа BMP utf8 [/utf8mb3] и utf8mb4 имеют идентичные характеристики хранения: одинаковые кодовые значения, одинаковая кодировка, одинаковая длина.
> * Для дополнительного символа **utf8 [/utf8mb3] не может хранить символ вообще**, в то время как utf8mb4 требуется четыре байта для его хранения. Поскольку utf8 [/utf8mb3] не может хранить символ вообще, у вас нет дополнительных символов в столбцах utf8 [/utf8mb3], и вам не нужно беспокоиться о преобразовании символов или потере данных при обновлении данных utf8 [/utf8mb3] из более старых версий MySQL.
> 

  Поэтому, если вы хотите, чтобы ваш столбец поддерживал хранение символов, лежащих вне BMP (и вы обычно этого хотите), таких как [emoji](https://en.wikipedia.org/wiki/Emoji), используйте "utf8mb4". См. Также [Какие наиболее распространенные не-BMP символы Unicode используются в действительности?](/questions/43035/what-are-the-most-common-non-bmp-unicode-characters-in-actual-use) ,

 

 `utf8mb4` символов `utf8mb4` полезен, потому что в настоящее время нам нужна поддержка для хранения не только языковых символов, но и символов, новых введенных смайликов и так далее.

 (adsbygoogle = window.adsbygoogle || []).push({});
  Хорошее чтение Mathias Bynens о том, [как поддерживать полный Unicode в базах данных MySQL,](https://mathiasbynens.be/notes/mysql-utf8mb4) также может пролить свет на это.

 

 Взято из [справочного руководства](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html) по [MySQL 8.0](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html):

 
>  * `utf8mb4`: кодировка UTF-8 набора символов Unicode с использованием от **одного до четырех байтов** на символ.
> * `utf8mb3`: кодировка UTF-8 набора символов Unicode с использованием от **одного до трех байтов** на символ.
> 

  В MySQL `utf8` в настоящее время является псевдонимом `utf8mb3` который **устарел** и будет удален в будущем выпуске MySQL. В этот момент `utf8` **станет ссылкой на** `utf8mb4`.

  Таким образом, независимо от этого псевдонима, вы можете сознательно установить кодировку `utf8mb4`.