1 (изменено: aristos, 2007-04-13 23:58:26)

Тема: Проблема с кодировками при восстановлении дампа.

Есть сервер под FreeBSD 5.5
phpMyAdmin - 2.10.0.2
Версия сервера: 4.1.22
Версия MySQL-клиента: 4.1.22
На запрос: SHOW VARIABLES LIKE 'char%'
Выдает:
character_set_client                  utf8
character_set_connection     cp1251
character_set_database              latin1
character_set_results                utf8
character_set_server                latin1
character_set_system               utf8

На этой же машине крутится скрипт, который записывает в БД данные о киноактерах. Нормально записывает нормально считывает, всё ок. Но через phpMyAdmin русский текст, который записывает скрипт отображается в виде "???? ???" вместо "Стив Раш", но я на это не особо обращал внимание - т.к. главное, что скрипт работает.
И в один прекрасный момент БД полетела, остался дамп, сделанный phpMyAdmin. В этом дампе так же вместо "Стив Раш" пишется "???? ???". Импортирую через phpMyAdmin, попробовал поставить все кодировка файла дампа - результат один и тот-же - вопросительные знаки на месте "???? ???".
1.Как мне импортировать имеющийся дамп, чтоб русские слова были в виде "???? ???" вместо "???? ???". Это было бы уже просто великолепно.
2. Как сделать чтоб "???? ???" отображалось по русски(cp1251).

За два дня перелопатил кучу документов...все не то. sad
http://php-myadmin.ru/learning/mysql-cir.html - читал. У меня нет русских букв вообще, мне бы дамп восстановить для начала sad
Проблема очень похожа на ту, что описана здесь http://forum.php-myadmin.ru/viewtopic.php?id=392 Но решения в том топике нет. sad
Заранее благодарен.

2

Re: Проблема с кодировками при восстановлении дампа.

Ответ на второй пункт. С первым советую не возиться, хотя при желании можно импортировать и крякозябы.

Предполагаю что данные дампа находятся в utf8, таблицы в latin1. Скрипт перекодирует дамп из utf8 в latin1 (ANSI), что выведет данные в cp1251, также скрипт заменяет кодировки полей с latin1 на сp1251. При импорте в phpMyAdmin необходимо будет выбрать кодировку дампа cp1251.

<?php

$filename = 'dump_name.sql';    // Имя файла дампа

$str = file_get_contents($filename);
$conv_str = iconv('UTF-8', 'ISO-8859-1//IGNORE', $str);
$conv_str = str_replace('latin1', 'cp1251', $conv_str);
$handle = fopen('converted.sql', 'w');
fwrite($handle, $conv_str);
fclose($handle);

?>

3 (изменено: aristos, 2007-04-14 01:31:12)

Re: Проблема с кодировками при восстановлении дампа.

Предполагаю что данные дампа находятся в utf8, таблицы в latin1.

Сам файл дампа utf8, таблицы -

ENGINE=MyISAM DEFAULT CHARSET=latin1;

$conv_str = iconv('UTF-8', 'ISO-8859-1//IGNORE', $str);

//IGNORE - здесь лишнее ? Его стер, а ISO-8859-1 - оставил.
Получилось:
$conv_str = iconv('UTF-8', 'ISO-8859-1', $str);
Пишет:
Call to undefined function iconv() in /usr/local/www/data/convert.php on line 6

Что делать ?

libiconv-1.9.2_2    A character set conversion library   - стоит.

4

Re: Проблема с кодировками при восстановлении дампа.

Стирать ничего не надо!

Что в phpinfo?

5 (изменено: aristos, 2007-04-14 15:52:01)

Re: Проблема с кодировками при восстановлении дампа.

Стирать ничего не надо!

Все вернул к исходному виду и всеравно не пашет.

Не очень понимаю что надо искать в phpinfo поэтому привожу всё sad

phpinfo()
PHP Version => 5.2.1

Configure Command =>  './configure' '--enable-versioning' '--with-layout=GNU' '--with-config-file-scan-dir=/usr/local/etc/php' '--disable-all' '--enable-libxml' '--with-libxml-dir=/usr/local' '--enable-reflection' '--program-prefix=' '--enable-fastcgi' '--with-apxs=/usr/local/sbin/apxs' '--with-regex=php' '--with-zend-vm=CALL' '--disable-ipv6' '--prefix=/usr/local'

_____________

Отредактировано Hanut.

6

Re: Проблема с кодировками при восстановлении дампа.

Среди расширений iconv отсутствует.

Обратите внимание на строку конфигурации.
Configure Command =>  './configure' '--enable-versioning' '--with-layout=GNU' '--with-config-file-scan-dir=/usr/local/etc/php' '--disable-all' '--enable-libxml' '--with-libxml-dir=/usr/local' '--enable-reflection' '--program-prefix=' '--enable-fastcgi' '--with-apxs=/usr/local/sbin/apxs' '--with-regex=php' '--with-zend-vm=CALL' '--disable-ipv6' '--prefix=/usr/local'
Если при сборке используется ключ --disable-all, то за ним должны перечисляться необходимые расширения, но у вас нет ключа --with-iconv[=DIR].

7

Re: Проблема с кодировками при восстановлении дампа.

Итак...первую часть сделал.
Как я это сделал(дляпатомков=))
PHP ругался на

Call to undefined function iconv() in /usr/local/www/data/convert.php on line 6

Пересобрал libiconv
Пересобрал php с опцией debug (наверняка как-то можно было подругому её включить), пересобрал все пакеты php5-XXX.
Напустил скрипт на дамп ещё раз и получил(видимо это более развернутое сообщение по той же самой ошибке):

Allowed memory size of 8388608 bytes exhausted (tried to allocate 184320 bytes) ...........

Погуглив выяснил, что это PHP памяти не хватает. В php.ini поставил 32 вместо 8.
Всё ок, прожевал, сконвертировал.
Импортирую phpMyAdmin поставив кодировку сp1251. Нихера. Знаки вопроса и всё.
Попробовал импортировать в формате latin1. Съел smile . Вместо знаков вопроса показывает  "???? ???" ("Стив Раш"). Скрипт это("???? ???") хавает и работает на УРА, всё супер.
Остался один вопрос...как сделать, чтоб phpMyAdmin отображал кодировку корректно ?
Делаю запрос

SELECT CONVERT(CONVERT(поле USING binary) USING cp1251) FROM таблица

- конвертит в нормальный русский. Как так сделать, чтоб и скрипт продолжал работать нормально и в myphpAdmin'е был нормально виден русский ?

8

Re: Проблема с кодировками при восстановлении дампа.

aristos
Что-то здесь не то. После конвертации данные должны быть в cp1251, значит вы мне где-то ошибочно описали кодировки в которых находятся данные. Если хотите, можете прислать мне дамп для перекодирования, иначе тыкать на угад займет слишком много времени.

9

Re: Проблема с кодировками при восстановлении дампа.

Что-то здесь не то. После конвертации данные должны быть в cp1251, значит вы мне где-то ошибочно описали кодировки в которых находятся данные. Если хотите, можете прислать мне дамп для перекодирования, иначе тыкать на угад займет слишком много времени.

мне сдается что просто что-то в настройках БД не так, как будто  cp1251 и latin1 поменяны местами=(
Дамп - 9 метров.
Куда можно прислать ?