|
 8.8 Кб |
|
| Добрый вечер.
Помогите, пожалуйста, решить проблему с дампом базы.
Существует действующий сайт, надо сделать обновление этого сайта, но сохранить старую базу.
Сама база для меня остаётся загадкой, что с ней можно сделать. В этой базе присутствуют таблицы двух типов InnoDB и MyISAM, сравнение по кодировке у этих таблиц тоже два latin1_swedish_ci и utf8_general_ci. Пытаюсь сделать дамп, сохраняю в файл и структуру и данные, файл создаётся, но при просмотре данных все кирилические символы выглядят как в прикреплённом файле
Вопрос теперь в том, как привести данные в надлежащий вид, что бы можно было нормально их читать и привести типы таблиц и сравнение к одному виду?
С типом таблиц и сравнением можно сделать просто дамп структуры и править уже файл, а вот с данными не могу понять что делать. | |
|
|
|
|
|
|
|
для: Slo_Nik
(30.04.2010 в 21:19)
| | А чем смотрите дамп? | |
|
|
|
|
 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 кирилические данные не отображаются нормально.
При восстановлении базы всё возвращается назад, ни чего не читается. | |
|
|
|
|
|
|
|
для: Slo_Nik
(01.05.2010 в 10:37)
| | Попробуйте в одной из таблиц сопоставление latin1_swedish_ci изменить на cp1251_general_ci (у вас данные в кодировке win-1251?) и сделать после этого дамп таблицы (изменять не бойтесь - это не приводит к преобразованию данных в таблице). Что-нибудь меняется? | |
|
|
|
|
|
|
|
для: cheops
(01.05.2010 в 11:31)
| | поменял сравнение в таблице, но сравнение полей не изменилось, т.е. показывает, что у самой таблицы сравнение cp1251_general_ci, но у отдельно взятых полей сравнение не изменилось, осталось latin1_swedish_ci и кирилические данные так и остались без изменений.
>у вас данные в кодировке win-1251?
да | |
|
|
|
|
|
|
|
для: 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 если в данных есть кирилические символы... | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.05.2010 в 08:52)
| | это потому, что там нет кириллических символов.
Да и как они там могут быть, когда поле типа latin1?
Самое честное решение - на php уровне вытащить все вытаскиваемые данные
(и возможно, тут же честно положить их в другую таблицу - корректно описанную, и через корректное подключение подцепленную) | |
|
|
|
|
|
|
|
для: Trianon
(02.05.2010 в 12:57)
| | Я об этом подумал, наверное так и сделаю.
>то потому, что там нет кириллических символов.
>Да и как они там могут быть, когда поле типа latin1?
назвал кирилическими символами потому, что на сайте выводится всё нормально, проблема только с дампом базы. | |
|
|
|
|
|
|
|
для: Trianon
(02.05.2010 в 12:57)
| | Попробовал получить данные на php уровне, положить в другую таблицу, но ни чего толком не добился, данные в новую таблицу попадают не преобразованные в нормальную кодировку.
Получаю данные из таблицы с сравнением utf8_general_ci, сравнение полей в этой таблице latin1_swedish_ci, в файле соединения с базой настроил кодировку соединения latin1, данные в браузер выводятся нормально.
Создал новую таблицу, где сравнение самой таблицы и полей utf8_general_ci, но ни к чему хорошему это не привело.
Пробовал применить к данным iconv() - результат "0".
Подскажите, пожалуйста, как правильно сделать? | |
|
|
|
|
|
|
|
для: Slo_Nik
(22.06.2010 в 09:58)
| | каким оператором задаете кодироку при установлении соединения? | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2010 в 12:28)
| | mysql_query("SET NAMES 'latin1'"); при этом отображается в браузере нормально, всё читается. | |
|
|
|
|
|
|
|
для: Slo_Nik
(22.06.2010 в 13:32)
| | SET NAMES 'latin1' не предполагает транспорт кириллицы через такое соединение. Вот вы её и не можете передать.
простите, я так и не въехал, Вам нужно чтобы всё отображалось сейчас (когда в базе фактически лежит латинский текст по коду символов соответствующий Вашей кириллице), или чтобы все корректно было в целом, включая снятие дампов?
Что делать я написал в (02.05.2010 в 12:57) | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2010 в 14:06)
| | Мне нужно чтобы данные отображались корректно в PMA, при снятии дампов и чтобы отображалось корректно при настройке соединения с базой в utf-8.
Если я указываю кодировку соединения с базой отличную от "latin1", то данные в браузере не читаются, одни "вопросы" или ещё какая то фигня.
Не читаются и в PMA и при снятии дампа, одни "крокозяблы".
Я попытался вытащить из базы данные, при кодировке соединения "latin1", все данные читаются в браузере. Теперь мне надо эти данные перенести в другую таблицу, где указано сравнение полей в utf8_general_ci. Попытался это сделать, но ни чего не получилось, данные не читаются ни при снятии дампа, ни через PMA... | |
|
|
|
|
|
|
|
для: Slo_Nik
(22.06.2010 в 14:29)
| | >Я попытался вытащить из базы данные, при кодировке соединения "latin1", все данные читаются в браузере.
Для этого шага Вам потребуется соединение с кодировкой latin1
Теперь мне надо эти данные перенести в другую таблицу, где указано сравнение полей в utf8_general_ci.
А для этого шага - потребуется соединение с правильной кодировкой.
Кстати, Вы можете отдельно задать кодировку входа и выхода - character set client и character set results - а значит, обеспечить работу цикла конвертации в пределах одного единственного соединения. | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2010 в 14:33)
| | >Для этого шага Вам потребуется соединение с кодировкой latin1
а разве mysql_query("SET NAMES 'latin1'") не указывает кодировку соединения?
>Теперь мне надо эти данные перенести в другую таблицу, где указано сравнение полей в >utf8_general_ci.
>А для этого шага - потребуется соединение с правильной кодировкой.
пытался подключиться к новой таблице через файл, где указана кодировка соединения как utf8 - ни чего не получилось.
>Кстати, Вы можете отдельно задать кодировку входа и выхода - character set client и character set >results
буду пробовать, вот только с английским не дружу, а на русском нет у меня описания этих функций, если есть где на русском - поделитесь ссылкой, пожалуйста. | |
|
|
|
|
|
|
|
для: Slo_Nik
(22.06.2010 в 15:01)
| | >пытался подключиться к новой таблице через файл, где указана кодировка соединения как utf8 - ни чего не получилось.
что значит не получилось?
Запросы были отвергнуты?
Мануал по 4.1 и выше на русский, насколько я знаю, еще не переведен.
Так что придется дружить. | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2010 в 15:16)
| | >что значит не получилось?
>Запросы были отвергнуты?
запрос был выполнен, но данные в таблицу занесены без изменений, т.е. остались нечитаемы...
для новой таблицы создал отдельную базу, вот и пытался с другой базой соеденить и перенести данные...
p.s. посмотрел в поисковике, нашёл что то похожее
<?php
mysql_query("set character_set_client='cp1251'");
mysql_query("set character_set_results='cp1251'");
?>
|
но вот как правильно это использовать, пока не понял | |
|
|
|
|
|
|
|
для: 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 - кодировка, в которой база возвращает результаты запросов | |
|
|
|
|
|
|
|
для: Slo_Nik
(22.06.2010 в 14:29)
| | ~дубль~ | |
|
|
|
|
|
|
|
для: sms-send
(22.06.2010 в 14:35)
| | да нет, зря затерли, между прочим.
Может статься, разными словами понятнее будет.
В любом случае, я никогда не против, если ту же мысль еще кто подтвердит. | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2010 в 14:37)
| | OK, учту =)
просто как то неудобно получается. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Slo_Nik
(23.06.2010 в 21:23)
| | > // обработал данные iconv, без этого выдавало ошибку
Так и нужно было ставить кодировку клиента cp1251, если данные хранились в этой кодировке. | |
|
|
|
|
|
|
|
для: sms-send
(23.06.2010 в 21:49)
| | >Так и нужно было ставить кодировку клиента cp1251, если данные хранились в этой кодировке
Действительно, это я не подумал... | |
|
|
|