Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дамп БД
 
 автор: Slo_Nik   (30.04.2010 в 21:19)   письмо автору
8.8 Кб
 
 

Добрый вечер.
Помогите, пожалуйста, решить проблему с дампом базы.
Существует действующий сайт, надо сделать обновление этого сайта, но сохранить старую базу.
Сама база для меня остаётся загадкой, что с ней можно сделать. В этой базе присутствуют таблицы двух типов InnoDB и MyISAM, сравнение по кодировке у этих таблиц тоже два latin1_swedish_ci и utf8_general_ci. Пытаюсь сделать дамп, сохраняю в файл и структуру и данные, файл создаётся, но при просмотре данных все кирилические символы выглядят как в прикреплённом файле
Вопрос теперь в том, как привести данные в надлежащий вид, что бы можно было нормально их читать и привести типы таблиц и сравнение к одному виду?
С типом таблиц и сравнением можно сделать просто дамп структуры и править уже файл, а вот с данными не могу понять что делать.

  Ответить  
 
 автор: cheops   (01.05.2010 в 07:50)   письмо автору
 
   для: Slo_Nik   (30.04.2010 в 21:19)
 

А чем смотрите дамп?

  Ответить  
 
 автор: Slo_Nik   (01.05.2010 в 10:37)   письмо автору
3.7 Кб
 
   для: cheops   (01.05.2010 в 07:50)
 

смотрю через Notepad++ v.4.7.5
Пробовал через стандартный блокнот, без изменений.
На сервере установлен PMA v.2.8.2.4,MySQL v.5.0.45, php v.5.2.6 сопоставление соединения с MySQL utf8-general_ci. все данные кроказяблами(прилагаю файлик)
Создал дам, данные выглядят так же.
Загрузил таблицы в базу на локальном, попробовал создать дамп при помощи SypexDumper_206, в самом файле кирилические данные читаются нормально,но только из тех таблиц, где сравненеие latin1_swedish_ci, из тех таблиц где сравненение utf_8_general_ci кирилические данные не отображаются нормально.
При восстановлении базы всё возвращается назад, ни чего не читается.

  Ответить  
 
 автор: cheops   (01.05.2010 в 11:31)   письмо автору
 
   для: Slo_Nik   (01.05.2010 в 10:37)
 

Попробуйте в одной из таблиц сопоставление latin1_swedish_ci изменить на cp1251_general_ci (у вас данные в кодировке win-1251?) и сделать после этого дамп таблицы (изменять не бойтесь - это не приводит к преобразованию данных в таблице). Что-нибудь меняется?

  Ответить  
 
 автор: Slo_Nik   (01.05.2010 в 11:54)   письмо автору
 
   для: cheops   (01.05.2010 в 11:31)
 

поменял сравнение в таблице, но сравнение полей не изменилось, т.е. показывает, что у самой таблицы сравнение cp1251_general_ci, но у отдельно взятых полей сравнение не изменилось, осталось latin1_swedish_ci и кирилические данные так и остались без изменений.
>у вас данные в кодировке win-1251?
да

  Ответить  
 
 автор: Slo_Nik   (02.05.2010 в 08:52)   письмо автору
 
   для: Slo_Nik   (01.05.2010 в 11:54)
 

Попробовал изменить сравнение полей таблицы на cp1251_general_ci, выдаёт ошибку #1366 - Incorrect string value: '\xCF\xD0\xCE\xD7\xC5\xC5' for column 'model' at row 306 если в данных есть кирилические символы...

  Ответить  
 
 автор: Trianon   (02.05.2010 в 12:57)   письмо автору
 
   для: Slo_Nik   (02.05.2010 в 08:52)
 

это потому, что там нет кириллических символов.
Да и как они там могут быть, когда поле типа latin1?

Самое честное решение - на php уровне вытащить все вытаскиваемые данные
(и возможно, тут же честно положить их в другую таблицу - корректно описанную, и через корректное подключение подцепленную)

  Ответить  
 
 автор: Slo_Nik   (02.05.2010 в 20:47)   письмо автору
 
   для: Trianon   (02.05.2010 в 12:57)
 

Я об этом подумал, наверное так и сделаю.
>то потому, что там нет кириллических символов.
>Да и как они там могут быть, когда поле типа latin1?
назвал кирилическими символами потому, что на сайте выводится всё нормально, проблема только с дампом базы.

  Ответить  
 
 автор: Slo_Nik   (22.06.2010 в 09:58)   письмо автору
 
   для: Trianon   (02.05.2010 в 12:57)
 

Попробовал получить данные на php уровне, положить в другую таблицу, но ни чего толком не добился, данные в новую таблицу попадают не преобразованные в нормальную кодировку.
Получаю данные из таблицы с сравнением utf8_general_ci, сравнение полей в этой таблице latin1_swedish_ci, в файле соединения с базой настроил кодировку соединения latin1, данные в браузер выводятся нормально.
Создал новую таблицу, где сравнение самой таблицы и полей utf8_general_ci, но ни к чему хорошему это не привело.
Пробовал применить к данным iconv() - результат "0".
Подскажите, пожалуйста, как правильно сделать?

  Ответить  
 
 автор: Trianon   (22.06.2010 в 12:28)   письмо автору
 
   для: Slo_Nik   (22.06.2010 в 09:58)
 

каким оператором задаете кодироку при установлении соединения?

  Ответить  
 
 автор: Slo_Nik   (22.06.2010 в 13:32)   письмо автору
 
   для: Trianon   (22.06.2010 в 12:28)
 

mysql_query("SET NAMES 'latin1'"); при этом отображается в браузере нормально, всё читается.

  Ответить  
 
 автор: Trianon   (22.06.2010 в 14:06)   письмо автору
 
   для: Slo_Nik   (22.06.2010 в 13:32)
 

SET NAMES 'latin1' не предполагает транспорт кириллицы через такое соединение. Вот вы её и не можете передать.

простите, я так и не въехал, Вам нужно чтобы всё отображалось сейчас (когда в базе фактически лежит латинский текст по коду символов соответствующий Вашей кириллице), или чтобы все корректно было в целом, включая снятие дампов?


Что делать я написал в (02.05.2010 в 12:57)

  Ответить  
 
 автор: Slo_Nik   (22.06.2010 в 14:29)   письмо автору
 
   для: Trianon   (22.06.2010 в 14:06)
 

Мне нужно чтобы данные отображались корректно в PMA, при снятии дампов и чтобы отображалось корректно при настройке соединения с базой в utf-8.
Если я указываю кодировку соединения с базой отличную от "latin1", то данные в браузере не читаются, одни "вопросы" или ещё какая то фигня.
Не читаются и в PMA и при снятии дампа, одни "крокозяблы".
Я попытался вытащить из базы данные, при кодировке соединения "latin1", все данные читаются в браузере. Теперь мне надо эти данные перенести в другую таблицу, где указано сравнение полей в utf8_general_ci. Попытался это сделать, но ни чего не получилось, данные не читаются ни при снятии дампа, ни через PMA...

  Ответить  
 
 автор: Trianon   (22.06.2010 в 14:33)   письмо автору
 
   для: Slo_Nik   (22.06.2010 в 14:29)
 

>Я попытался вытащить из базы данные, при кодировке соединения "latin1", все данные читаются в браузере.

Для этого шага Вам потребуется соединение с кодировкой latin1

Теперь мне надо эти данные перенести в другую таблицу, где указано сравнение полей в utf8_general_ci.

А для этого шага - потребуется соединение с правильной кодировкой.

Кстати, Вы можете отдельно задать кодировку входа и выхода - character set client и character set results - а значит, обеспечить работу цикла конвертации в пределах одного единственного соединения.

  Ответить  
 
 автор: Slo_Nik   (22.06.2010 в 15:01)   письмо автору
 
   для: Trianon   (22.06.2010 в 14:33)
 

>Для этого шага Вам потребуется соединение с кодировкой latin1
а разве mysql_query("SET NAMES 'latin1'") не указывает кодировку соединения?

>Теперь мне надо эти данные перенести в другую таблицу, где указано сравнение полей в >utf8_general_ci.
>А для этого шага - потребуется соединение с правильной кодировкой.
пытался подключиться к новой таблице через файл, где указана кодировка соединения как utf8 - ни чего не получилось.

>Кстати, Вы можете отдельно задать кодировку входа и выхода - character set client и character set >results

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

  Ответить  
 
 автор: Trianon   (22.06.2010 в 15:16)   письмо автору
 
   для: Slo_Nik   (22.06.2010 в 15:01)
 

>пытался подключиться к новой таблице через файл, где указана кодировка соединения как utf8 - ни чего не получилось.

что значит не получилось?
Запросы были отвергнуты?

Мануал по 4.1 и выше на русский, насколько я знаю, еще не переведен.
Так что придется дружить.

  Ответить  
 
 автор: Slo_Nik   (22.06.2010 в 15:18)   письмо автору
 
   для: Trianon   (22.06.2010 в 15:16)
 

>что значит не получилось?
>Запросы были отвергнуты?

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

p.s. посмотрел в поисковике, нашёл что то похожее

<?php 
mysql_query
("set character_set_client='cp1251'"); 
mysql_query("set character_set_results='cp1251'");
?>

но вот как правильно это использовать, пока не понял

  Ответить  
 
 автор: sms-send   (22.06.2010 в 23:17)   письмо автору
 
   для: Slo_Nik   (22.06.2010 в 15:18)
 

Допустим кто-то когда-то записал в эту базу слово "кириллица" в кодировке cp1251, но используя кодировку соединения latin1. База не сопротивлялась, потому что получила в запросе набор байт, который в кодировке latin1 соответствует строке в этом файле. Для базы всё абсолютно корректно.

* При извлечении данных с выходной кодировкой cp1251, база (которая честно думает, что держит в себе latin1) пытается преобразовать байты символов имеющейся строки кодированной latin1 в соответствующие байты символов кодировки cp1251, которых вобщем то в этой кодировке не существует. Все символы, которым не нашлось аналогов в cp1251, заменяются на знаки вопроса.
* При извлечении данных с выходной кодировкой latin1, база отдаёт строку как есть в кодировке latin1, т.е. ровно тот набор байт, который она получила, без преобразований.

При отображении в вашем браузере, этот набор байт трактуется браузером как строка в кодировке cp1251, которая соответствует исходному слову "кириллица". То есть на уровне байт мы имеем корректные данные в cp1251.

Теперь нужно эти данные просто записать в другую таблицу. СУБД при этом должна знать уже действительную кодировку строки (cp1251), чтобы знать как правильно трактовать полученный из текста запроса набор байт.

-----

character_set_client - кодировка, в которой клиент передаёт базе запросы
character_set_results - кодировка, в которой база возвращает результаты запросов

  Ответить  
 
 автор: sms-send   (22.06.2010 в 14:35)   письмо автору
 
   для: Slo_Nik   (22.06.2010 в 14:29)
 

~дубль~

  Ответить  
 
 автор: Trianon   (22.06.2010 в 14:37)   письмо автору
 
   для: sms-send   (22.06.2010 в 14:35)
 

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

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

  Ответить  
 
 автор: sms-send   (22.06.2010 в 23:34)   письмо автору
 
   для: Trianon   (22.06.2010 в 14:37)
 

OK, учту =)
просто как то неудобно получается.

  Ответить  
 
 автор: Slo_Nik   (23.06.2010 в 21:23)   письмо автору
 
   для: Trianon   (22.06.2010 в 14:37)
 

Trianon, sms-send благодарю за подсказки, немного разобрался, что к чему.
теперь в pma, дамп базы нормально читаются.
сделал так

<?php 
require_once("connect1.php"); // подключение к исходной базе
mysql_query("set character_set_client = utf8"); 
mysql_query("set character_set_results = latin1"); 
mysql_query("set collation_connection = utf8_general_ci"); 

// запрос к таблице на получение данных
// обработал данные iconv, без этого выдавало ошибку
//подключение к новой базе данных
// запись изменённых данных в новую таблицу

mysql_query("set character_set_results = utf8");

// вывод данных из новой таблицы, всё читается
?>

ещё через .htaccess указал кодировку по умолчанию, utf8. все файлы в этой же кодировке, новая база и таблица - сравнение utf8_general_ci

  Ответить  
 
 автор: sms-send   (23.06.2010 в 21:49)   письмо автору
 
   для: Slo_Nik   (23.06.2010 в 21:23)
 

> // обработал данные iconv, без этого выдавало ошибку

Так и нужно было ставить кодировку клиента cp1251, если данные хранились в этой кодировке.

  Ответить  
 
 автор: Slo_Nik   (23.06.2010 в 22:17)   письмо автору
 
   для: sms-send   (23.06.2010 в 21:49)
 

>Так и нужно было ставить кодировку клиента cp1251, если данные хранились в этой кодировке
Действительно, это я не подумал...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования