|
|
Кодовая страница «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 проголосовавших
|
|
|
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" :)
|
|
|
|
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 а не из сорцов и простоя сервака, даже получасового, мне бы не простили...
|
|
|
|
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
|
|
|
|
edge
|
20 May : 19:26
|
|
Комментариев: 12
Регистрация: 07 Dec : 14:47
|
Да, действительно, я тоже нарывался на эту бяку с рутом, просто забыл предупредить..
|
|
|
|
Ne01eX
|
22 May : 06:21
|
Комментариев: 385
Регистрация: 03 Aug : 07:05
|
Извините конечно, а что этот дамп IPB в KOI8-R не конвертиться?
|
|
|
|
maax
|
22 May : 11:22
|
Комментариев: 40
Регистрация: 05 Jan : 20:07
|
зачем в кои? дамп был в cp1251, и заливать его также, в итоге то utf будет :)
|
|
|
|
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. Этот параметр заставляет сервер игнорировать кодироку, посылаемую клиентом, и использовать указанную серверу. В примере конфигурации ниже этот параметр уже есть.
|
|
|
Вы должны авторизоваться, чтобы оставлять сообщения. Нажмите сюда для регистрации либо зайдите под своим именем.
|