NC LUG
 





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

Началось все внезапно. Беды не предвещало ничего… Принесли мне дамп БД с просьбой залить все это счастье в базу. Создал я базу через 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

>> Список статей в этой категории
<< Назад в главную панель статей

Оценка
Статья была оценена:  10.0 - 2 проголосовавших

Комментарии...
bullet maax | 16 May : 16:12

Комментариев: 40

Регистрация: 05 Jan : 20:07
совсем не смешно, такая большая статья и собственно ни о чем... уточнять нужно версию.. 4.1.x были такие разные... :) поэтому побыстрее 5 ветку объявили стабильной..

и делается все проще, в my.cnf:

[mysqld]
default-character-set=cp1251

[client]
default-character-set=cp1251

а init-connect так вообще можно по разному писать:
set-variable = init_connect="set character set cp1251"
init-connect = "set character set cp1251"
init_connect = "set character set cp1251"

а еще можно mysql пересобрать с "--with-charset=cp1251 --with-collation=cp1251_general_ci" :)


Комментарии...
bullet WingMan | 16 May : 23:57

Комментариев: 2

Регистрация: 16 Dec : 09:17
[mysqld]
default-character-set=cp1251

[client]
default-character-set=cp1251


все это было сделано....
проблема была в правах пользователей и в кодировке PHP ...

Если такой умный, почему ж не посоветовал в форуме когда вопрос стоял остро??

а еще можно mysql пересобрать с "--with-charset=cp1251 --with-collation=cp1251_general_ci" :)


Опять же ж в форуме писал, что ставил из rpm а не из сорцов и простоя сервака, даже получасового, мне бы не простили...


Комментарии...
bullet maax | 17 May : 10:53

Комментариев: 40

Регистрация: 05 Jan : 20:07
о как сложно, с каких пор права пользователя и тем более кодировка PHP влияют на кодировку мускуля?

по тексту статьи про default-character-set не было сказано ни слова, а именно эта строчка делает ненужным выполнение SET character_set_client = cp1251, SET character_set_results = cp1251, SET character_set_connection = cp1251, изменение других переменных не нужно, ну разве что collate установить..

я не считаю себя умным, и честно говоря поста в форуме не видел.. а вообще мы обсуждаем статью, которая по-моему мнению описывает сугубо частный случай, mysql+phpmyadmin+ipb... в общем случае задача решается:

echo "create database my_db" | mysql -uroot
mysql --default-character-set=cp1251 -uroot -Dmy_db < my_dump.sql


Комментарии...
bullet edge | 20 May : 19:26
Комментариев: 12

Регистрация: 07 Dec : 14:47
Да, действительно, я тоже нарывался на эту бяку с рутом, просто забыл предупредить..


Комментарии...
bullet Ne01eX | 22 May : 06:21

Комментариев: 385

Регистрация: 03 Aug : 07:05
Извините конечно, а что этот дамп IPB в KOI8-R не конвертиться?


Комментарии...
bullet maax | 22 May : 11:22

Комментариев: 40

Регистрация: 05 Jan : 20:07
зачем в кои? дамп был в cp1251, и заливать его также, в итоге то utf будет :)


Комментарии...
bullet Geosan | 23 May : 16:51

Комментариев: 1

Регистрация: 21 Jun : 14:17
Я нашел все нужное вот тут http://phpclub.ru/faq/wakka.php?wakka=Mysql41Rus&v=eum
У меня не получалось из foxpro грузить мускуль, помогла вот эта строчка
Начиная с версий 4.1.15 и 5.0.13 добавить в секцию [mysqld] или [server] файла my.cnf/my.ini параметр skip-character-set-client-handshake. Этот параметр заставляет сервер игнорировать кодироку, посылаемую клиентом, и использовать указанную серверу. В примере конфигурации ниже этот параметр уже есть.



Вы должны авторизоваться, чтобы оставлять сообщения. Нажмите сюда для регистрации либо зайдите под своим именем.



Все права защищены. При перепечатке ссылка на NC LUG обязательна.