What is the difference between utf8mb4_0900_ai_ci and utf8_unicode_ci database text coding in mysql (especially in terms of performance) ?
1 Answer 1
- The encoding is the same. That is, the bytes look the same.
- The character set is different. utf8mb4 has more characters.
- The collation (how comparisions are done) is different.
- The perfomance is different, but it rarely matters.
utf8_unicode_ci implies the CHARACTER SET utf8 , which includes only the 1-, 2-, and 3-byte UTF-8 characters. Hence it excludes most Emoji and some Chinese characters.
utf8mb4_unicode_ci implies the CHARACTER SET utf8mb4 is the corresponding COLLATION for the 4-byte CHARACTER SET utf8mb4 .
The Unicode organization has been evolving the specification over the years. Here are the mappings from its "versions" to MySQL Collations:
Most of the differences will be in areas that most people never encounter. One example: At some point, a change allowed Emoji to be distinguished and ordered in some manner.
However: The speed of collation is usually the least of the performance issues in queries. INDEXes , JOINs , subqueries, table scans, etc are much more critical to performance.
Это не точная и окончательная инструкция к действию использующая правильные термины и оптимальные варианты. Это скорее лог текущей проблемы.
Проблема
При подключении к MySQL 8.0 из PHP получаем:
"Server sent charset (255) unknown to the client."
Причина
Банально в несовпадении кодировок сервера и клиента.
Сервер: MySQL 8.0. Новая кодировка по-умолчанию — utf8mb4. Это хорошо и правильно. 4 байта позволяют хранить гораздо больший набор символов.
Клиент: PHP. Кодировка (в нашем случае) utf8.
Решение
Как обычно можно ставить заплатки или решить радикально и правильно
Правильное решение
Такая проблема возникается, если версия PHP старая. Да, всего-то навсего. В моём случе была версия 7.0.15. Поставил сегодняшнюю последнюю версия 7.3.2. и проблема исчезла. Всё работает на новых кодировка. Читал где-то, что достаточно 7.0.19.
Заплатки
Поставить на сервер кодировку "как раньше".
Пару слов о utf8mb4_0900_ai_ci
Это правило по которому символы сравниваются между собой во время сортировки.
- utf8 — UTF-8 Unicode Encoding.
- mb4 — MultiByte — версия в 4 байта. Если не указывать и поставить только utf8, то будет версия utf8mb3 — три байта с поддержкой символов входящих в Basic Multilingual Plane (BMP).
- 0900 — версия алгоритма — Unicode Collation Algorithm (UCA). Если версию не указать, то по-умолчанию: UCA-based collations without a version number in the name use the version-4.0.0 UCA weight keys.
- ai — accent insensitivity — не делать различий между e, è, é, ê and ë. Есть версия и as — accent sensitivity.
- ci — case insensitive — не делать различий между А и а. Регистронезависимая версия. Есть версия и cs — case sensitive — регистрозависимая.
Вполне логично использовать имено эти кодировку и правило сравнения. В версии 8.0 они уставливаются по-умолчанию.
Так же можно помнить, что есть правила сортировки и для национальных языков или просто _bin — Binary
36 просмотра
1 ответ
12479 Репутация автора
В чем разница между utf8mb4_0900_ai_ci и utf8_unicode_ci базами данных текстового кодированием в MySQL (особенно с точки зрения производительности)?
Ответы (1)
плюса
69332 Репутация автора
- Кодирование является то же самое. То есть байты выглядят одинаково.
- Набор символов отличается. utf8mb4 имеет больше символов.
- Сличение (как сравнениях сделано) отличается.
- Perfomance отличается, но это редко имеет значение.
utf8_unicode_ci подразумевает CHARACTER SET utf8 , что включает только 1-, 2- и 3-байтовые символы UTF-8. Следовательно, это исключает большинство эмодзи и некоторые китайские иероглифы.
utf8mb4_unicode_ci подразумевает, что CHARACTER SET utf8mb4 это соответствует COLLATION 4-байтовому CHARACTER SET utf8mb4 .
Организация Unicode развивала спецификацию на протяжении многих лет. Вот сопоставления из его «версий» в MySQL Collations:
Большинство различий будет в областях, с которыми большинство людей никогда не сталкиваются. Один пример: в какой-то момент изменения позволили различать и упорядочивать эмодзи.
Однако: скорость сортировки обычно является наименьшей из проблем производительности в запросах. INDEXes , JOINs подзапросы, сканирование таблиц и т. д. гораздо более важны для производительности.