Решение проблемы Server sent charset (255) unknown to the client
Почему возинкает проблема `Server sent charset (255) unknown to the client` и как её рашить
© 2019-02-10, Игорь Гузей (Guzei.com)
Это не точная и окончательная инструкция к действию использующая правильные термины и оптимальные варианты. Это скорее лог текущей проблемы.
Проблема
При подключении к 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