Utf8mb4 0900 ai ci

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.

Читайте также:  For honor бесплатно steam

Решение

Как обычно можно ставить заплатки или решить радикально и правильно

Правильное решение

Такая проблема возникается, если версия 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 отличается, но это редко имеет значение.
Читайте также:  Vba проверка наличия файла в папке

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 подзапросы, сканирование таблиц и т. д. гораздо более важны для производительности.

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *