1

Тема: Экспорт/импорт нескольких баз: проблема с кодировкой

Здравствуйте!
Есть два сервера, на одном стоит debian etch (4.0) на другом - lenny (5.0).
Пытаюсь с первого на второй перенести все базы данных
Некоторые - получается, некоторые - русские буквы крякозябрами (в .sql дампе, при чем и в дампе phpMyAdmin ом сделанные, и sypex dumperом)

вот такого плана:
(460, '?????‹?‚', 1),
(460, '???????°???‚???‡???‹????', 1),
(460, '?­?‚???‚', 1),

sypex dumper по всякому настраивал, не получается

вот список баз данных с первого сервера: (php my admin)

    normalbase1     latin1_swedish_ci    
    failbase1     utf8_unicode_ci     
    failbase2     utf8_general_ci    

failbase1 и failbase2 - в дампе крякозябрами, а normalbase1 - в дампе русскими буквами. где собака зарыта?

2

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

darvin
Проблема в кодировке соединения MySQL. Проверить ее можно запросом:
SHOW GLOBAL VARIABLES LIKE 'char%';

character set connection - должен быть кодировкой используемой на сайте.

При доступе к конфигурационному файлу MySQL можно прописать в нем строку:
init-connect="SET NAMES utf8"

Так же стоит поправить:
default-character-set=utf8

Это для установки кодировки соединения глобально. Есть возможность установить кодировку соединения с MySQL для каждого скрипта отдельно, для чего во всех скриптах следует сразу после функции mysql_connect добавить строку:
mysql_query('SET NAMES utf8');

Обратите внимание, что установка кодировки соединения будет корректно действовать для вновь записываемых в БД данных, но крякозябы в БД она не исправит, для этого следует их перекодировать. Способ перекодирования и шаги для этого необходимые надо обсуждать отдельно, так как это бывает не просто.

3

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

Hanut сказал:

darvin
Проблема в кодировке соединения MySQL. Проверить ее можно запросом:
SHOW GLOBAL VARIABLES LIKE 'char%';

character set connection - должен быть кодировкой используемой на сайте.

При доступе к конфигурационному файлу MySQL можно прописать в нем строку:
init-connect="SET NAMES utf8"

Так же стоит поправить:
default-character-set=utf8

Это для установки кодировки соединения глобально. Есть возможность установить кодировку соединения с MySQL для каждого скрипта отдельно, для чего во всех скриптах следует сразу после функции mysql_connect добавить строку:
mysql_query('SET NAMES utf8');

Обратите внимание, что установка кодировки соединения будет корректно действовать для вновь записываемых в БД данных, но крякозябы в БД она не исправит, для этого следует их перекодировать. Способ перекодирования и шаги для этого необходимые надо обсуждать отдельно, так как это бывает не просто.

на старом сервере, откуда хочу слить дамп:

Variable_name     Value
character_set_client     latin1
character_set_connection     latin1
character_set_database     latin1
character_set_filesystem     binary
character_set_results     latin1
character_set_server     latin1
character_set_system     utf8
character_sets_dir     /usr/share/mysql/charsets/


на новом, куда заливаю:
character_set_client      utf8
character_set_connection     utf8
character_set_database     utf8
character_set_filesystem     binary
character_set_results     utf8
character_set_server     utf8
character_set_system     utf8
character_sets_dir     /usr/share/mysql/charsets/


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

4

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

darvin
На втором сервере все хорошо и ничего трогать не надо. Теперь необходимо перекодировать все данные в нормальный utf8.
(460, '?????‹?‚', 1), - Это означает, что данные отправленные в utf8 были записаны в latin1, в соответствии с кодировкой соединения MySQL (latin1).

Я знаю только один способ перекодировать данные такого вида в нормальный utf8.

1) Сохраняем дамп данных только с таблицами имеющими крякозябы. Дамп в utf8, разумеется.
2) Вручную меняем в дампе во всех структурах на создание таблиц latin1 на utf8.
3) Импортируем дамп в тестовую БД, можно локально.
4) Создаем PHP скрипт вида:

<?php

function Connect() {
    $link = @mysql_connect('localhost', 'user', 'pass') or exit('mysql_connect');
    mysql_query('SET NAMES latin1') or exit('set names latin1');
    mysql_select_db('db_name') or exit('select db');
    return $link;
}

$db = Connect();

/* Рабочие переменные */
$sql['table'] = 'tbl_name';   // Имя таблицы.
$sql['key'] = 'id';           // Уникальный идентификатор таблицы, ключ.
$sql['value'] = 'field_name'; // Имя поля в котором производится переконвертация.

$query = 'SELECT `' . $sql['value'] . '`, `' . $sql['key'] . '` FROM `' . $sql['table'] . '` WHERE `' . $sql['value'] . '` IS NOT NULL';
$result = mysql_query($query) or exit('select');
while ($row = mysql_fetch_assoc($result)) {
    $cont[$row[$sql['key']]] = $row[$sql['value']];
}

mysql_query('SET NAMES utf8');
echo 'count ' . count($cont) . "<br>\n";
foreach ($cont as $key => $value) {
    mysql_query('UPDATE `' . $sql['table'] . '` SET `' . $sql['value'] . '` = "' . addslashes($value) . '" WHERE `' . $sql['key'] . '` = "' . addslashes($key) . '"');
}

?>

5) Редактируем соответствующим образом данные для подключения к MySQL и три рабочие переменные и запускаем скрипт. И так следует проделать со всеми полями таблиц имеющих крякозябы.

Важное замечание! Не запускайте этот скрипт под root!
Создайте отдельного пользователя со всеми правами на используемую БД, но обязательно без Grant привилегий.

5

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

ааааа!!!!
там три сайта, все на движках
там по 100 таблиц
нету никаких решений готовых, может какойнибудь mysql migration tool?
или syrex dumper это умеет?

6

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

я согласен послностью сервер переносить, вместе с его глюками и багами
/var/lib/mysql перекопировал, базы перекопировались, но - крякозябры
что в конфиге поменять у второго сервера, чтобы он базы первого читал без крякозябр?
насколько метод не дампов а копирования файлов базы отвратителен?

7

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

darvin
Готовых решений я не знаю.

darvin сказал:

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

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

darvin сказал:

что в конфиге поменять у второго сервера, чтобы он базы первого читал без крякозябр?

init-connect="SET NAMES latin1"

8

Re: Экспорт/импорт нескольких баз: проблема с кодировкой

решился вопрос


mysqldump -uroot -p --default-character-set=latin1 ИМЯ_БАЗЫ > dump.sql
sed 's/latin1/utf8/g' dump.sql > dump_utf.sql

целевой сервер:
В /etc/my.cnf в секции [mysqld] должно быть следующие строки
default-character-set=utf8
character-set-server=utf8

в секции [mysql] обязательно должна быть строка
default-character-set=utf8

mysql -uroot -p < dump_utf.sql