Кодовая страница «CP 1251» или как я боролся с кодировкой в MySQL 4.1.x

Началось все внезапно. Беды не предвещало ничего… Принесли мне дамп БД с просьбой залить все это счастье в базу. Создал я базу через PHPMyAdmin, импортировал дамп в свежее созданную базу, проверил что и как записалось, возрадовался и успокоился… Звонит мне клиент, чей дамп был, и говорит - погляди-ка что показывает на страничке (оговорюсь - дамп был от борды IPB- Invision Power Board, форум короче)… Смотрю - действительно неважно: везде где кириллица вместо текста вопросительные знаки (?????????? ?? ?? ????? ??? ???? e t.c.). С PHPMyAdmin смотрю-все в порядке, а вот борда… Вот тут и началось…

Стал я бороться с кодировкой… Скажу сразу - совокуплялся я с конфигами трое суток кряду (с небольшим перерывом на сон). Врагу бы не пожелал.

Не стану описывать мое эмоциональное и психическое состояние на тот момент, перейдем к решению данной проблемы…

Во первых, просмотрел существующую кодировку сервера мускуль, исправил все на ср 1251, проблема не решилась. Во вторых, в php.ini default_charset поставил тоже 1251. Далее (как рекомендовал мне на форуме edge) в my.cnf в разделе [mysqld] прописал init-connect=”SET NAMES cp1251”… Но все осталось на месте… Никаких намеков на правильную работу. Я был в отчаянии.
Далее, чисто случайно, в качестве эксперимента (а что еще оставалось делать?) я ╚зарезал╩ права (да, да - именно ущемил в правах пользователя этой БД) и… о чудо! Все заработало!
Как я позже понял - init-connect=”SET NAMES cp1251” НЕ ДЕЙСТВУЕТ на пользователя БД root и других пользователей у которых права на базу выставлены как GRANT ALL PRIVELEGES ON…… (полагаю, сделано это для того, что если какой-нибудь пользователь напортачил с базой, пользователь root или другой пользователь со всеми правами для данной БД смог исправить ╚косяки╩). Ну и в php.ini установка нужной кодировки помогла.

Резюмируя:

Если возникает проблема подобного рода выполняем следующие действия:
1. Проверяем кодировку сервера MySQL (SHOW VARIABLES LIKE ‘char%’);
2. Устанавливаем нужную кодировку: SET имя_переменнной= … SET character_set_clien cp1251 SET character_set_connection cp1251 SET character_set_database cp1251 SET character_set_results cp1251 SET character_set_server cp1251 SET character_set_system utf8. Последнюю переменную мне поменять не удалось, видимо это и невозможно, т.к. сервер в ответ на мою попытку SET character_set_system= cp1251, отвечал что мол ERROR 1193 (HY000): Unknown system variable 'character_set_system'
3. В my.cnf в разделе [mysqld] прописываем init-connect=”SET NAMES cp1251”
4. В /etc/php.ini - выставляем: default_charset = “cp1251” - это тоже немаловажно, так как обработка базы (в моем случае) проводилась интерпретатором PHP.
5. И последнее - пользователю БД выставляем следующие права:
ВЫБОР ДАННЫХ ТАБЛИЦ
ВСТАВКА ДАННЫХ ТАБЛИЦ
ОБНОВЛЕНИЕ ДАННЫХ ТАБЛИЦ
УДАЛЕНИЕ ДАННЫХ ТАБЛИЦ
СОЗДАНИЕ ТАБЛИЦ
СБРОС ТАБЛИЦ
Этих прав пользователю - хватит сполна для работы с БД.

Таким образом, проблема была решена. Пишу эту статью, так как тема актуальна, и, надеюсь, что на эти грабли Вы уже не наступите.

С уважением, Игорь. В.Борисов aka WingMan

RSS-материал