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?.
Единственные случаи, с которыми я столкнулся (пока), где utf8mb4 был «обязательным», - это китайский и смайлики. Есть неясные алфавиты, которые в этом нуждаются. –
Это не должно требоваться для китайского - китайского + корейского + японского, должно быть, в базовом многоязычном плане, который охватывает MySQL 'utf8'. Тем не менее, нет оснований не использовать 'utf8mb4' сейчас, и действительно это требуется для всех новых emoji, например – thomasrutter
Его также необходимо, если вы используете для хранения зашифрованных паролей и данных в своей базе данных.Я сохранял зашифрованный пароль в mysql, используя обычный формат utf8, который вызывал у меня много проблем с некоторыми паролями случайным образом и очень трудно отлаживать, поэтому я попытался использовать кодировку base64 и исправил проблему временно. Но теперь я знаю причину. –