2015-05-06 3 views
146

В чем разница между utf8mb4 и utf8 charsets in mysql?
Я уже знаю о ASCII, UTF-8, UTF-16 и UTF-32 кодировок; , но мне любопытно узнать, в чем отличие группы кодировок 'utf8mb4' с другими типами кодирования, определенными на сервере mysql.В чем разница между кодировками utf8mb4 и utf8 в mysql?

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

ответ

166

UTF-8 - кодировка переменной длины. В случае UTF-8 это означает, что для хранения одной кодовой точки требуется от одного до четырех байтов. Однако в кодировке MySQL, называемой «utf8», хранится максимум три байта на кодовую точку.

Таким образом, набор символов «utf8» не может хранить все кодовые точки Юникода: он поддерживает только диапазон от 0x000 до 0xFFFF, который называется «Basic Multilingual Plane». См. Также Comparison of Unicode encodings.

Это то, что the MySQL documentation должен сказать об этом:

Набор символов с именем utf8 использует максимум три байта на символ и содержит только символы BMP. По состоянию MySQL 5.5.3, набор символов utf8mb4 использует максимум четыре байта на символ поддерживает дополнительные символы:

  • для символа BMP, utf8 и utf8mb4 имеют одинаковые характеристики хранения: значения и тот же код, такой же кодирование, такой же длина.

  • Для дополнительного символа utf8 не может хранить символ вообще, а utf8mb4 требует четырех байтов для его сохранения. Поскольку utf8 не может хранить символ вообще, у вас нет дополнительных символов в столбцах utf8, и вам не нужно беспокоиться о преобразовании символов или об утрате данных при обновлении данных utf8 из более старых версий MySQL.

Так что, если вы хотите, чтобы ваша колонка для поддержки хранения символов, лежащих вне BMP (и вы обычно хотите), такие как emoji, используйте «utf8mb4». См. Также What are the most common non-BMP Unicode characters in actual use?.

+5

Единственные случаи, с которыми я столкнулся (пока), где utf8mb4 был «обязательным», - это китайский и смайлики. Есть неясные алфавиты, которые в этом нуждаются. –

+16

Это не должно требоваться для китайского - китайского + корейского + японского, должно быть, в базовом многоязычном плане, который охватывает MySQL 'utf8'. Тем не менее, нет оснований не использовать 'utf8mb4' сейчас, и действительно это требуется для всех новых emoji, например – thomasrutter

+3

Его также необходимо, если вы используете для хранения зашифрованных паролей и данных в своей базе данных.Я сохранял зашифрованный пароль в mysql, используя обычный формат utf8, который вызывал у меня много проблем с некоторыми паролями случайным образом и очень трудно отлаживать, поэтому я попытался использовать кодировку base64 и исправил проблему временно. Но теперь я знаю причину. –

14

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

Хорошее чтение на How to support full Unicode in MySQL databases от Mathias Bynens также может пролить свет на это.

Смежные вопросы