Тема: Изменение кодировки таблиц с cp1251 на utf8

Здравствуйте! Как изменить кодировку таблиц в phpMyAdmin с cp1251_general_ci на utf8_general_ci?

Исходные данные:

MySQL

    Сервер: mysql via TCP/IP
    Версия сервера: 5.1.41-log
    MySQL-кодировка: UTF-8 Unicode (utf8)

Веб-сервер

    Apache/1.3.37 (Unix) PHP/5.2.10 mod_ssl/2.8.28 OpenSSL/0.9.7e-p1
    Версия MySQL-клиента: 5.1.36
    PHP расширение: mysql

Основные настройки

    Сопоставление соединения с MySQL utf8_general_ci

Facebook Twitter

2

Re: Изменение кодировки таблиц с cp1251 на utf8

Самый простой способ - это сохранить дамп базы данных в .sql файл, затем открыть этот файл в редакторе (рекомендую Notepad++) и поменять во всех таблицах кодировку с cp1251 на utf8, а так же все сравнения с cp1251_general_ci на utf8_general_ci. Затем импортируйте дамп обратно. Обратите внимание, что если в дампе есть строка SET NAMES cp1251, то ее тоже надо поправить на SET NAMES utf8.

ВКонтакте Facebook Twitter

Re: Изменение кодировки таблиц с cp1251 на utf8

У меня в таблицах "кракозябры" и все сравнения с cp1251_general_ci это означает, что кодировка таблиц в cp1251? Как точно узнать в какой кодировке таблицы базы данных?

У меня есть небольшое сомнение хотелось бы его развеять.

Я правильно определ причину появления "кракозябр" в таблицах базы данных?

Отредактировано Маверик (2012-12-16 00:31:12)

Facebook Twitter

Re: Изменение кодировки таблиц с cp1251 на utf8

У меня размер базы 180 МБ, а в phpMyAdmin можно импортировать 64 МБ. Как быть?

Отредактировано Маверик (2012-12-16 00:32:33)

Facebook Twitter

5

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

У меня в таблицах "кракозябры" и все сравнения с cp1251_general_ci это означает, что кодировка таблиц в cp1251? Как точно узнать в какой кодировке таблицы базы данных?

Покажите как в phpMyAdmin выглядят крякозябры, какая кодировка таблицы и какая кодировка страниц сайта.

Маверик пишет:

У меня размер базы 180 МБ, а в phpMyAdmin можно импортировать 64 МБ. Как быть?

Импортируйте из каталога, или разбейте дамп по таблицам.
В конфигурационный файл phpMyAdmin (config.inc.php) добавьте строку:

$cfg['UploadDir'] = './upload/';

Создайте в корне phpMyAdmin каталог upload и загрузите в него дамп, после чего он появится на странице импорта в выпадающем списке. Таким образом можно импортировать дампы практически любого размера.

ВКонтакте Facebook Twitter

Re: Изменение кодировки таблиц с cp1251 на utf8

Hanut пишет:

Покажите как в phpMyAdmin выглядят крякозябры, какая кодировка таблицы и какая кодировка страниц сайта.

Вот так выглядят:

http://s018.radikal.ru/i513/1212/79/415a7316ff14.jpg

Таблицы базы данных.

http://s020.radikal.ru/i702/1212/6c/06d7738072e7.jpg

Таблица post.

Как посмотреть какая кодировка таблицы и какая кодировка страниц сайта?

Facebook Twitter

7

Re: Изменение кодировки таблиц с cp1251 на utf8

Судя по картинкам, кодировка таблиц у вас cp1251, а кодировка сайта utf8. Для перекодирования надо иметь доступ к консоли на сервере. Если доступ к консоли имеется, то выполните команду (вместо pass пропишите пароль пользователя root, вплотную к ключу -p):

mysqldump db_name table_name -uroot -ppass --default-character-set=cp1251 > dump.sql

Откройте сохраненный дамп в редакторе и посмотрите как выглядит кириллица. Если кириллица читается, то поменяйте кодировку таблиц с cp1251 на utf8 и импортируйте дамп выбрав кодировку файла дампа utf-8 (изначально она выбрана).

ВКонтакте Facebook Twitter

Re: Изменение кодировки таблиц с cp1251 на utf8

Hanut пишет:

Судя по картинкам, кодировка таблиц у вас cp1251, а кодировка сайта utf8. Для перекодирования надо иметь доступ к консоли на сервере. Если доступ к консоли имеется, то выполните команду (вместо pass пропишите пароль пользователя root, вплотную к ключу -p):

mysqldump db_name table_name -uroot -ppass --default-character-set=cp1251 > dump.sql

Доступ к панели управления хостингом есть. Есть права к базе данных у меня одного. (Я не могу добавить ни одного нового пользователя, так как максимально допустимое число (1) пользователей MySQL для моего тарифного плана уже создано).

Вышеуказанную команду вводить в phpMyAdmin?

Здесь:

http://s020.radikal.ru/i711/1212/24/82f8e63686b9.jpg

?

Facebook Twitter

9

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

Вышеуказанную команду вводить в phpMyAdmin?

Нет, команда для консоли. Посмотрите есть ли у вас возможность подключится к хостингу по SSH; это и будет консоль.

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

ВКонтакте Facebook Twitter

10

Re: Изменение кодировки таблиц с cp1251 на utf8

Подключил SSH-клиент PuTTY.

1. Сделал дамп (копию) БД. Для этого зашел по ssh и набрал команду:

mysqldump --no-tablespaces -h ваш_логин.mysql -u ваш_логин_mysql -pВаш_пароль -B Ваша_БД > mybd.sql

Результат - получилось  (посмотрел по FTP-клиенту, копия базы есть).

2. Конвертировал БД. Для этого выполнил следующую команду:

iconv -f CP1251 -t UTF-8 mybd.sql > mybdutf.sql

Результат - неизвестен (скопировал базу на компьютер, открыл Notepad++, в строках 429, 589, 645, 758, 1055, 2899, 2900, 2901 и других строках - кракозябры.

3. Попытался сделать импорт БД. Для этого выполнил:

mysql -h ваш_логин.mysql -u ваш_логин_mysql -pВаш_пароль -B Ваша_БД < mybdutf.sql.

Результат - ERROR 1064 (42000) at line 282: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Р РЋР С' at line.

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

Такая процедура смены кодировки указана на моём хостинге (RU-CENTER).

Отредактировано Маверик (2012-12-17 15:50:23)

Facebook Twitter

11

Re: Изменение кодировки таблиц с cp1251 на utf8

Для получения информации по текущим кодировкам в phpMyAdmin ввёл команды:

SHOW VARIABLES LIKE "char%";

http://s53.radikal.ru/i141/1212/93/8450b014dd45.jpg

SHOW VARIABLES LIKE '%collation%';

http://i049.radikal.ru/1212/fa/25a4b85dc96d.jpg

Что это означает?

Facebook Twitter

12

Re: Изменение кодировки таблиц с cp1251 на utf8

Вы не добавили ключ default-character-set, который я указал выше. Просто сохранить дамп не достаточно.

mysqldump --default-character-set=cp1251 --no-tablespaces -h ваш_логин.mysql -u ваш_логин_mysql -pВаш_пароль -B Ваша_БД > mybd.sql

Сохранили дамп. Конвертировать его не надо. Надо открыть в редакторе и заменить все cp1251 на utf8, затем импортируйте через консоль или через phpMyAdmin.

Смотрите глобальные переменные (GLOBAL). Глобальные настройки влияют на кодировку.

SHOW GLOBAL VARIABLES LIKE "char%";

ВКонтакте Facebook Twitter

13

Re: Изменение кодировки таблиц с cp1251 на utf8

Hanut пишет:

Вы не добавили ключ default-character-set, который я указал выше. Просто сохранить дамп не достаточно.

mysqldump --default-character-set=cp1251 --no-tablespaces -h ваш_логин.mysql -u ваш_логин_mysql -pВаш_пароль -B Ваша_БД > mybd.sql

Хорошо, я попробую.

Hanut пишет:

Сохранили дамп. Конвертировать его не надо. Надо открыть в редакторе и заменить все cp1251 на utf8, затем импортируйте через консоль или через phpMyAdmin.

Я уже сконвертировал (не без проблем) программой Sypex Dumper, но видимо не получилось. Все значения cp1251 заменились на utf8, но кракозябры остались и в редакторе и в phpMyAdmin.

У меня вопрос. Почему нельзя конвертировать дамп программой, а нужно это делать руками? (Ручная работа займёт много времени, не хотелось бы, чтобы она была напрасной). К тому же мне всегда важно понимать, почему нужно делать, так а не иначе.

Hanut пишет:

Смотрите глобальные переменные (GLOBAL). Глобальные настройки влияют на кодировку.

SHOW GLOBAL VARIABLES LIKE "char%";

Глобальные настройки вот какие:

http://s52.radikal.ru/i135/1212/a8/07e420a7ed56.jpg

Как мне их изменить и нужно ли? У меня форум на движке vBulletin 4.2.0 и насколько я знаю, там кодировка по умолчанию, и они «забывают», что неплохо бы указывать кодировку, как таблиц, так и соединения.

Facebook Twitter

14

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

У меня вопрос. Почему нельзя конвертировать дамп программой, а нужно это делать руками?

Конвертировать не надо, надо создать дамп с ключом --default-character-set=cp1251 и данные будут нормальными, затем в дампе надо заменить все cp1251 на utf8; в любом редакторе это выполняется методом поиска и замены одной кнопкой.

У vBulletin есть настройка конфигурации устанавливающая кодировку соединения с MySQL, ее надо установить в utf8. Сделать это надо после того, как в базе данных будет читаемая кириллица в таблицах с кодировкой utf8.

ВКонтакте Facebook Twitter

15

Re: Изменение кодировки таблиц с cp1251 на utf8

cp1251_general_ci тоже заменять на utf8_general_ci?

Можно ли как-то изменить глобальные переменные? Есть ли в этом смысл? Или это может сделать только хостер?

Отредактировано Маверик (2012-12-18 14:33:12)

Facebook Twitter

16

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

cp1251_general_ci тоже заменять на utf8_general_ci?

Обязательно.

Маверик пишет:

Можно ли как-то изменить глобальные переменные? Есть ли в этом смысл? Или это может сделать только хостер?

Если у вас есть доступ к конфигурационному файлу MySQL, то можно, иначе нельзя. Но делать это вовсе не обязательно. У форума есть настройка конфигурации устанавливающая кодировку соединения с MySQL - установите ее в utf8 и проблем не будет. Это равносильно смене глобальной кодировки для скрипта форума.

ВКонтакте Facebook Twitter

17

Re: Изменение кодировки таблиц с cp1251 на utf8

Hanut пишет:

Откройте сохраненный дамп в редакторе и посмотрите как выглядит кириллица. Если кириллица читается, то поменяйте кодировку таблиц с cp1251 на utf8 и импортируйте дамп выбрав кодировку файла дампа utf-8 (изначально она выбрана).

Я сохранил дамп с ключём. Открыл дамп Notepad++, но кириллица не читается, кракозябры - 'Описание выгрузки финансовых данных РёР

Есть смысл заменять cp1251 на utf8 в дампе? Или как дальше быть?

Facebook Twitter

18

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

Есть смысл заменять cp1251 на utf8 в дампе? Или как дальше быть?

В статусной строке посмотрите кодировку, там будет либо ANSI, либо UTF8. Если там ANSI, то в меню выберите кодировку данных UTF8 без бом-байта (только не перекодировать). Это должно показать кириллицу. Когда увидите кириллицу в читаемом виде, тогда меняйте кодировку таблиц.

ВКонтакте Facebook Twitter

19

Re: Изменение кодировки таблиц с cp1251 на utf8

Hanut пишет:

Конвертировать не надо, надо создать дамп с ключом --default-character-set=cp1251 и данные будут нормальными, затем в дампе надо заменить все cp1251 на utf8; в любом редакторе это выполняется методом поиска и замены одной кнопкой.

У vBulletin есть настройка конфигурации устанавливающая кодировку соединения с MySQL, ее надо установить в utf8. Сделать это надо после того, как в базе данных будет читаемая кириллица в таблицах с кодировкой utf8.

Кириллица появилась в дампе и в таблицах базы данных в phpMyAdmin. Но на форуме кракозябры:

�� ���� ������������� �� ��������� �������:
������� �� �������.

���� ������ ����������:

Форум закрывал перед этими операциями. В админку зайти не могу. Есть и другие кракозябры. Сейчас всё выглядит следующим образом - Форум бухгалтеров и аудиторов.

Для получения информации по текущим кодировкам в phpMyAdmin ввёл команды:

SHOW VARIABLES LIKE "char%";

Результат:

character_set_client     utf8
character_set_connection     utf8
character_set_database     utf8
character_set_filesystem     binary
character_set_results     utf8
character_set_server     cp1251
character_set_system     utf8
character_sets_dir     /.ro/usr/local/mysql/share/mysql/charsets/

SHOW VARIABLES LIKE '%collation%';

Результат:

collation_connection     utf8_general_ci
collation_database     utf8_general_ci
collation_server     cp1251_general_ci

SHOW GLOBAL VARIABLES LIKE "char%";

Результат:

character_set_client     cp1251
character_set_connection     cp1251
character_set_database     cp1251
character_set_filesystem     binary
character_set_results     cp1251
character_set_server     cp1251
character_set_system     utf8

Изменений нет, всё так же, как и в аналогичных запросах в нижеуказанных постах. Указаны/присутствуют настройки cp1251_general_ci.

Как быть дальше?

Отредактировано Маверик (2012-12-19 18:30:56)

Facebook Twitter

20

Re: Изменение кодировки таблиц с cp1251 на utf8

После внесения изменений в файл config.php кракозябры наконец пропали. Открываем данный файл и находим строчку:

// $config['Mysqli']['charset'] = 'utf8';

По умолчанию она закомментирована. Нужно её раскомментировать (убрать //) и указать кодировку utf8. Выйти должно следующее:

$config['Mysqli']['charset'] = 'utf8';

Результат с кодировкой utf8 - Форум бухгалтеров и аудиторов Glbyh.Ru. Всё вроде бы нормально работает.

Меня смущает то, что на сервере некоторые настройки по умолчанию cp1251. Не будет ли это мешать нормальной работе сайта, его производительности (загрузка страниц и другим) и доставлять неудобства пользователям?

Facebook Twitter

21

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

Меня смущает то, что на сервере некоторые настройки по умолчанию cp1251.

Это не имеет значения. С установленной кодировкой соединения с MySQL ($config['Mysqli']['charset'] = 'utf8';) скрипт будет всегда работать с указанной кодировкой utf8; то есть будет создавать таблицы в данной кодировке, будет передавать и принимать данные в данной кодировке. Изначально проблема у вас была именно в этой одной строке, если бы сразу ее установили в utf8, то не пришлось бы мучиться с перекодированием.

ВКонтакте Facebook Twitter

22

Re: Изменение кодировки таблиц с cp1251 на utf8

Hanut пишет:

Изначально проблема у вас была именно в этой одной строке, если бы сразу ее установили в utf8, то не пришлось бы мучиться с перекодированием.

Я пробовал её изменять, не помогало. Форум был неработоспособен (или что-то с ним было не ладное, отображение букв нечеткое и не везде, пустые места по моему и в админку не получалось зайти). Сейчас точно не скажу, что было, но помню, что сразу всё вернул обратно, так как испугался, того что увидел.

Отредактировано Маверик (2012-12-19 21:34:08)

Facebook Twitter

23

Re: Изменение кодировки таблиц с cp1251 на utf8

Я не могу понять. При регистрации пользователя с ником например Олег Николаевич, не получается зарегистрироваться, так как выдаёт сообщение:

Ваше имя пользователя не может быть длиннее 25 символов.

хотя символов меньше 25. Мне говорили, что это кракозябры в базе данных и проблемы в кодировке. Но сейчас то в базе кракозябров нет, а проблема осталась. Непонятно.

Я уже и сервер перезагрузил на хостинге.

Отредактировано Маверик (2012-12-19 21:41:46)

Facebook Twitter

24

Re: Изменение кодировки таблиц с cp1251 на utf8

Маверик пишет:

Я пробовал её изменять, не помогало.

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

Маверик пишет:

хотя символов меньше 25

Обратитесь к разработчику форума или к сообществу пользователей. Я не знаю в чем там проблема.

ВКонтакте Facebook Twitter

25

Re: Изменение кодировки таблиц с cp1251 на utf8

Проблема с регистрацией русских ников на форуме была решена следующим образом. У меня стоит PHP 5.2 я зашёл на хостинг и настроил модуль добавив в настройках расширение mbstring. Проблема исчезла, могу регистрировать ник из 25 русских символов включая пробелы.

Попутно я поставил модуль PHP 5.3 (он мне был доступен) в настройках расширение mbstring уже стоит. Всё отлично! Проблемы с метками тоже пропали.

Hanut пишет:
Маверик пишет:

У меня размер базы 180 МБ, а в phpMyAdmin можно импортировать 64 МБ. Как быть?

Импортируйте из каталога, или разбейте дамп по таблицам.
В конфигурационный файл phpMyAdmin (config.inc.php) добавьте строку:

$cfg['UploadDir'] = './upload/';

Создайте в корне phpMyAdmin каталог upload и загрузите в него дамп, после чего он появится на странице импорта в выпадающем списке. Таким образом можно импортировать дампы практически любого размера.

Можно здесь поподробнее. Несмотря на то, что я могу загружать большие дампы программой Sypex Dumper, я бы всё-таки хотел в дальнейшем делать это в phpMyAdmin. Так вот, как найти конфигурационный файл phpMyAdmin config.inc.php на сервере? Я его там не могу найти и у меня ощущение, что его там нет. Хостинг у меня RU-CENTER, если это имеет значение.

Отредактировано Маверик (2012-12-23 09:33:15)

Facebook Twitter