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

341

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

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

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

Мойтаба Резаян
источник

Ответы:

392

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

CodeCaster
источник
10
Единственные случаи, с которыми я столкнулся (до сих пор), когда utf8mb4 был «обязателен», - это китайцы и смайлики. Есть малоизвестные алфавиты, которым это нужно.
Рик Джеймс
10
Это также необходимо, если вы используете для хранения зашифрованных паролей и данных в вашей базе данных. Я хранил зашифрованный пароль в mysql, используя обычный формат utf8, что доставляло мне много хлопот с некоторыми паролями случайным образом и было очень трудно отлаживать, поэтому в конце концов я попытался использовать base64 encode и временно исправил проблему. Но теперь я знаю причину.
Мойтаба Резаян
38
Зашифрованные данные @idealidea являются двоичными, и вы не должны хранить двоичные данные в столбце varchar. :)
CodeCaster
8
@thomasrutter Попробуйте этот (𡞰) символ сохранить в UTF-8. :)
502_Geek
2
@MojtabaRezaeian это несколько зависит от алгоритма паролей - bcrypt2 будет производить ASCII.
Ясен
60

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

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

Джимми Кейн
источник
11
MySQL 8.0 теперь по умолчанию использует набор символов utf8mb4. [ mysql.com/products/enterprise/techspec.html]
Ахмед Резк
47

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

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

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

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

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

Чтобы завершить ответ, я хотел бы добавить комментарий @ WilliamEntriken ниже (также взятый из руководства):

Чтобы избежать двусмысленности относительно значения utf8, рассмотрите возможность utf8mb4явного указания ссылок на набор символов вместо utf8.

simhumileco
источник