Крохотная заплатка для кодировок

Опубликовано Опубликовано в рубрике Easy Patch, PHP, SQL

Война двух титанов utf-8 и windows-1251 уже давно мучает IT-сферу. Что делать, если при запросе к sql выводятся символы другой кодировки?

Первым делом, конечно же необходимо проверить соответствие кодировок у базы данных и страницы вывода информации. Уверен, что все за этим следят. Но что же делать, если всё равно выводятся знаки вопросов?

Корни ошибки расходятся в две стороны — либо это сбитые настройки PHP, либо косяки MySQL.

Случай первый. PHP использует неверную кодировку с клиентской стороны

В чём выражается косяк: — В phpMyAdmin (PMA) все по-русски, а на выход приходят вопросительные знаки.
— Код, вносящий данные в БД, принимает русский, но после записи, как в выводе, так и в PMA — вопросительные знаки.

Выход: После соединения с базой жёстко зададим язык общения БД и клиента кодом

SET NAMES кодировка

где «кодировка» — имя кодировки, в которой по вашему мнению хранятся данные.

Возможный результат: Если буквы стали русскими, то это означает, что данные в базе лежат в нужной кодировке, сама база эту кодировку и использует.
Если только буквы стали русскими, а слова нет, то код ожидает данные в другой русской кодировке.

Замечания: Можно попробовать заставить MySQL автоматически выполнять запрос при каждом соединении с сервером. Для этого нужно в файле my.cnf/my.ini в разделе server дописать строку:

init-connect="SET NAMES кодировка"

НО это НЕ будет работать, если пользователь, работающий с БД имеет привилегию SUPER (root в их числе).

Начиная с версий 4.1.15 и 5.0.13 дописать в раздел mysqld или server файла my.cnf/my.ini параметр skip-character-set-client-handshake. Он заставляет сервер игнорировать кодировку с клиентской стороны и использовать указанную серверу.

Случай второй. MySQL использует неверную кодировку

В чём выражается косяк: Русский текст приходит в скрипт как русский, в консоли тоже. Но не работает сортировка, перевод между регистрами и т.д. Решение N1 не годится, т.к. либо русский текст становится вопросами, либо mysql_error() возвращает сообщение похожее на «Illegal mix of collations (latin1_general_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE)…». А PMA русский текст отображает как непонятно что.

Выход:
В PMA выполнием запрос

SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица

где «таблица» и «поле» — это соответствующие таблица и поле с русским текстом.

Возможный результат:
Если буквы стали русскими, то текст в базе хранился в неправильной кодировке и его необходимо сконвертировать. Если русскими стали только буквы, но не слова нет, значит неверно выбрана одна из русских кодировок.

Замечание:
Установите для MySQL необходимую кодировку по умолчанию. Однако, это решение сработает сработает, если кодировки не переопределены для базы, таблицы или столбца. Для этого необходимо в раздел server файла my.cnf/my.ini дописать строку:

default-character-set=utf-8
Можно переконвертировать таблицы в необходимую кодировку.

Безошибочного кода Вам!

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

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