Сегодня все разработчики в Интернете пытаются уйти от ASCII и прочих частичных кодировок к юникоду и, конкретно, к UTF-8. Корректная кодировка особенно важна для систем управления базами данных: неправильная установка кодировок «СУБД-хранение/СУБД-соединение/приложение» приводит не только к некорректному отображению символов, но может вызвать куда более серьёзные и глубокие проблемы в будущем. Полтора года назад я потратил полную рабочую неделю, с утра до ночи, для хотя бы частичного решения проблемы разбившихся за годы символов в огромной БД одного из наших старых проектов — GLADpwnz. Мне пришлось написать несколько утилит с практически эвристическим анализом, и даже после этого не всю информацию удалось восстановить из-за возникающей неоднозначности. Эта неоднозначность умножила некоторые символы на ноль навсегда, теперь их возможно восстановить разве что из контекста. Так что важность изначально правильной настройки всех кодировок сложно переоценить.

Большинство веб-приложений (и других типов серверного ПО) умеют самостоятельно автоматически настраивать кодировку и коллацию СУБД (вроде SET NAMES 'utf8' и т.п.), так что глобальные настройки СУБД просто не имеют никакого эффекта. Однако, некоторые CMS (особенно, как показала практика, MODX) не используют эту возможность или по какой-то непонятной причине не хотят этого делать. И здесь всплывают глобальные настройки системы управления базами данных.

Каждая версия MySQL (кроме форка MariaDB, конечно) поставляется с установленным глобальным чарсетом latin1 и коллацией latin1_swedish_ci, которые, как раз, напрочь убивают всё, что не является латиницей. Ситуация может быть разрешена либо хак-патчингом и отладкой ядра целевого приложения (что обычно очень быстро становится очень запутанным) или установкой корректных глобальных уставок СУБД. Для MySQL это делается добавлением в конфигурационный файл (обычно находящийся в /etc/mysql/my.cnf) следующих строк в любом месте под секцией [mysqld]:

character-set-server = utf8
collation-server = utf8_general_ci
skip-character-set-client-handshake

Последняя строка (skip-character-set-client-handshake) пропускает необходимость выполнения директив SET NAMES/SET CHARACTER SET при подключении и делает все три настройки кодировки сервера character_set_clientcharacter_set_database и character_set_connection согласующимися.

comments powered by HyperComments