Тема: Проблемы с кодировкой.

Проблема в том что в таблицах при работе чарез phpMyAdmin выдает ??? ???????? ???????? ??????
Но на сайте отображается нормально. Как понял проблема в кодировке которую использует клиент так как в базе все норм хранится и достается от туда тоже в нормальной кодировке cp1251.
Как сделать так что бы и в MyAdmin тоже нормально отображался русский текс

MySQL

Сервер: localhost via TCP/IP
Версия сервера: 5.1.30-community
Версия протокола: 10
Пользователь: root@localhost
MySQL-кодировка: UTF-8 Unicode (utf8)

Веб-сервер

Apache/2.2.8 (Win32) DAV/2 PHP/5.2.8
Версия MySQL-клиента: 5.0.51a
PHP расширение: mysql

phpMyAdmin
Информация о версии: 3.1.1

запрос show variables like'character%';
выдает
character_set_client    utf8
character_set_connection    utf8
character_set_database    cp1251
character_set_filesystem    binary
character_set_results    utf8
character_set_server    cp1251
character_set_system    utf8
character_sets_dir    C:\MySQL\share\character\

2

Re: Проблемы с кодировкой.

shadowmaster63
Проблема в неверной кодировке соединения с MySQL.
Выполните запрос: SHOW GLOBAL VARIABLES LIKE 'char%';
Думаю у вас там будет latin1 в character_set_connection.

Решение двуступенчатое.
1) Добавьте в конфигурационный файл MySQL (my.ini), раздел [mysqld], строку:

init-connect="SET NAMES cp1251"

2) Данные в БД надо перекодировать. Для чего сделайте, с помощью phpMyAdmin, дамп. Покажите структуру любой таблицы содержащей кириллицу и пример того, как выглядят крякозябы, если они есть. Используйте для открывания дампа нормальный текстовый редактор, например, Notepad++.

И последнее: никогда не подключайте скрипты через root, этого пользователя можно использовать только для phpMyAdmin. Для всех других скриптов создавайте отдельных пользователей и наделяйте их только необходимыми правами, не выставляйте права в разделе "Администрирование".

Re: Проблемы с кодировкой.

Все таблицы в базе идут в latin1_swedish_ci



-- Структура таблицы `news`
--

CREATE TABLE IF NOT EXISTS `news` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(11) NOT NULL DEFAULT '0',
  `added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `body` text NOT NULL,
  `subject` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `added` (`added`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Дамп данных таблицы `news`
--

INSERT INTO `news` (`id`, `userid`, `added`, `body`, `subject`) VALUES
(3, 5, '2009-01-12 18:50:38', '[center][size=18]???? ???????? ???????? ?????? [color=red]?????????(uploader)[/color]\r\n???????? ??? ? ????? shadow63[/size][/center]', '?????? ????????'),
(2, 5, '2009-01-11 19:08:02', '[center]????? ?????????? ?? ????????????? ?????? ???? \r\n[size=14][color=blue]OAO"????????????"[/color][/size]\r\n???????????? ??????? ???????? ??? ???? ????????????\r\n???????????? ???????.\r\n??????? ??? ??? ????? ?????????? ??????????. \r\n?????? ?? ??????????? ???????? ????? ???????? ?? ?????.[/center]', '???????? ??????');

-- --------------------------------------------------------

Re: Проблемы с кодировкой.

Я немного поковырялся и понял что через пхпвдмин косяк при дампе он делат дамп с уже крякозябрами.
Дамп надо делать с особыми параметрами

mysqldump --default-character-set=latin1 --skip-set-charset mydatabase > ./mytable.sql

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

А потом я так понял создать базу заного но уже в нужной кодировке и в дампе заменить все latin1 на cp1251.

я правильно понял?

Re: Проблемы с кодировкой.

shadowmaster63 сказал:

Я немного поковырялся и понял что через пхпвдмин косяк при дампе он делат дамп с уже крякозябрами.
Дамп надо делать с особыми параметрами

mysqldump --default-character-set=latin1 --skip-set-charset mydatabase > ./mytable.sql

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

А потом я так понял создать базу заного но уже в нужной кодировке и в дампе заменить все latin1 на cp1251.

я правильно понял?

Да вот так всё работает.

надо потом открыть дамп заменить на нужную кодировку и через импорт в ПХПАдмин импортировать базу только там тоже надо выставить нужную кодировку.

6

Re: Проблемы с кодировкой.

Блин, точно такая проблема.
Скажите, а mysqldump --default-character-set=latin1 --skip-set-charset mydatabase > ./mytable.sql
это где выполнять?

Re: Проблемы с кодировкой.

Это в коммандной строке.
только не забудь добавить после mysqldum ключи -u имяпользователя -p пароль пользователя вообщем вот так

mysqldump -u root - p --default-character-set=latin1 --skip-set-charset mydatabase > ./mytable.sql
после этого появится предложение ввести пароль
Enter password: вводите  ваш пароль и нажимайте энтер)

Дам базы сохранится туда где открыта командная строка тоесть если она выглядет так

C:\server\mysql
то именно там и будет лежать дамп базы с именеи mytable.sql

8

Re: Проблемы с кодировкой.

shadowmaster63
Совершенно верно, можно делать и через mysqldump, если он доступен, конечно.
Скрипт, что я вам отослал, делает практически то же самое, но с возможностью одновременно заменить все вхождения кодировок на корректные.

Только одно замечание - phpMyAdmin делает дамп и сохраняет данные в том виде, в каком они лежат в БД. phpMyAdmin всегда прав и если есть "косяк", то точно не в нем. smile

Re: Проблемы с кодировкой.

Просто если делать дамп через админ то он делает их с крякозябрами ((( может где там какую настройку поставить надо а если с ключами к mysqldump то нормальный кирилический текс сохраняется))

10

Re: Проблемы с кодировкой.

А можно еще вопрос в дагонку....
Как сделать что бы через MySQLAdministrator входящий в пакет MySQL GUI Tools 5.0 можно автоматически делать дампы базы по расписанию...
вроде сохранил подключение и пароль в нужном шифровании и всё равно в назначенное время дампа не происходит.. а в ручную без проблем..
Какого пользователя надо создать с какими правами что бы он мог делать дам базы.

11

Re: Проблемы с кодировкой.

shadowmaster63
Дампы по расписанию делаются с помощью создания задания в планировщике Windows. Если что-то не получается, то надо смотреть на корректность генерируемой строки в задаче планировщика. Вы можете задачу вручную создать, без помощи программы, используя тот же mysqldump.

Для удаленных серверов лучше делать дамп с помощью Cron (в случае Unix систем).