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

226

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

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

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

Теги:
character-encoding
utf-8
encoding
utf8mb4

3 ответа

263
Лучший ответ

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 используются в действительности? ,

  • 8
    Единственные случаи, с которыми я столкнулся (до сих пор), когда utf8mb4 был «обязателен», - это китайцы и смайлики. Есть неясные алфавиты, которым это нужно.
  • 5
    Это также необходимо, если вы используете для хранения зашифрованных паролей и данных в вашей базе данных. Я хранил зашифрованный пароль в mysql, используя обычный формат utf8, что доставляло мне много хлопот с некоторыми паролями случайным образом и было очень трудно отлаживать, поэтому в конце концов я попытался использовать base64 encode и временно исправил проблему. Но теперь я знаю причину.
Показать ещё 8 комментариев
37

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

Хорошее чтение Mathias Bynens о том, как поддерживать полный Unicode в базах данных MySQL, также может пролить свет на это.

6

Взято из справочного руководства по MySQL 8.0:

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

  • utf8mb3: кодировка UTF-8 набора символов Unicode с использованием от одного до трех байтов на символ.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню