UTF-8, - кодировка переменной длины. В случае UTF-8 это означает, что для хранения одной кодовой точки требуется от одного до четырех байтов. Однако кодировка MySQL под названием «utf8» (псевдоним «utf8mb3») хранит максимум три байта на кодовую точку.
Поэтому набор символов «utf8» / «utf8mb3» не может хранить все кодовые точки Unicode: он поддерживает только диапазон от 0x000 до 0xFFFF, который называется « Базовая многоязычная плоскость ». Смотрите также Сравнение кодировок Unicode .
Вот что (предыдущая версия той же страницы в) документации MySQL должно сказать об этом:
Набор символов с именем utf8 [/ utf8mb3] использует максимум три байта на символ и содержит только символы BMP. Начиная с MySQL 5.5.3, набор символов utf8mb4 использует максимум четыре байта на символ, поддерживает дополнительные символы:
Для символа BMP utf8 [/ utf8mb3] и utf8mb4 имеют идентичные характеристики хранения: одинаковые кодовые значения, одинаковая кодировка, одинаковая длина.
Для дополнительного символа utf8 [/ utf8mb3] не может хранить символ вообще , в то время как utf8mb4 требуется четыре байта для его хранения. Поскольку utf8 [/ utf8mb3] не может хранить символ вообще, у вас нет дополнительных символов в столбцах utf8 [/ utf8mb3], и вам не нужно беспокоиться о преобразовании символов или потере данных при обновлении данных utf8 [/ utf8mb3] из более старых версий MySQL.
Поэтому, если вы хотите, чтобы ваш столбец поддерживал хранение символов, лежащих вне BMP (и вы обычно этого хотите), таких как emoji , используйте «utf8mb4». См. Также Какие наиболее распространенные не-BMP символы Unicode используются в действительности? ,