Решение проблемы Server sent charset (255) unknown to the client

08.01.2021 Откл Автор: blouse8

При подключении к MySQL 8.0 из PHP получаем:
“Server sent charset (255) unknown to the client.”

Причина

Банально в несовпадении кодировок сервера и клиента.

Сервер: MySQL 8.0. Новая кодировка по-умолчанию – utf8mb4. Это хорошо и правильно. 4 байта позволяют хранить гораздо больший набор символов.

     character-set-server : utf8mb4
        collation-server     : utf8mb4_0900_ai_ci

Клиент: PHP. Кодировка (в нашем случае) utf8.

Решение

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

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

Такая проблема возникается, если версия PHP старая. Да, всего-то навсего. В моём случе была версия 7.0.15. Поставил сегодняшнюю последнюю версия 7.3.2. и проблема исчезла. Всё работает на новых кодировка. Читал где-то, что достаточно 7.0.19.

Заплатки

Поставить на сервер кодировку “как раньше”.

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8

Пару слов о 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