SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.10.2009 12:53:46

MainVoid
Участник
Зарегистрирован: 30.10.2009
Сообщений: 5

Перевеод мультиязычной базы в UTF8

Есть сайт на трех языках (Русский, Арабский и Английский).
[сайт работает на системе битрикс, все данные по всем трем языкам хранятся в одной базе].
Для каждого из сайтов установлена своя кодировка (windows-1251 - Рус., iso-8859-1 - Англ., windows-1256 - Араб.).
Нужно все перевести в UTF-8.
Проблемы с БД.
Слил дамп базы, перекодировал его в UTF8 с помощью notepad++ - залил обратно.
Для двух языков (русский и английский) все замечательно.
А вот арабский не встал как нужно, в базе его значения крякозябрами.

Пробовал также оставлять базу как есть, и править ее следующим образом:

ALTER TABLE {тут все таблицы} CONVERT TO CHARACTER SET utf8;
ALTER TABLE {тут все таблицы} DEFAULT CHARACTER SET utf8;
ALTER DATABASE {моя бд} DEFAULT CHARACTER SET utf8;

Получилось еще хуже, кириллица не конвертировалась тоже.

Подскажите, что еще можно попробовать?

Заранее спасибо

Неактивен

 

#2 30.10.2009 14:43:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Перевеод мультиязычной базы в UTF8

А таблицы для разных языков — разные? Или все три кодировки писались в одну
таблицу latin1?

Неактивен

 

#3 30.10.2009 17:21:13

MainVoid
Участник
Зарегистрирован: 30.10.2009
Сообщений: 5

Re: Перевеод мультиязычной базы в UTF8

Есть отдельные таблицы - а есть смешанные, где все три языка в своей кодировке сохранены в рамках одной таблицы

Неактивен

 

#4 30.10.2009 17:25:06

MainVoid
Участник
Зарегистрирован: 30.10.2009
Сообщений: 5

Re: Перевеод мультиязычной базы в UTF8

сравнение для всех таблиц задано cp1251_general_ci

Неактивен

 

#5 30.10.2009 17:46:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Перевеод мультиязычной базы в UTF8

Ну вот поэтому русский и сохранился.

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

-- Создать новую таблицу
CREATE TABLE tablename_new LIKE tablename;
ALTER TABLE tablename_new CONVERT TO CHARSET utf8;

-- Создать временную табличку для арабских букв и вставить туда символы
CREATE TABLE tmp LIKE tablename;
INSERT INTO tmp SELECT * FROM tablename WHERE lang='arabic';

-- Обозначить, что кодировка в таблице совсем не 1251 и сконвертировать в utf8
ALTER TABLE tmp DEFAULT CHARSET cp1256; -- и отдельно по столбцам со строками тоже
ALTER TABLE tmp CONVERT TO CHARSET utf8;

-- Вставить сконвертированные буквы в новую табличку и удалить временную
INSERT INTO tablename_new SELECT * FROM tmp;
DROP TABLE tmp;

-- Переименовать таблички
RENAME TABLE tablename TO tablename_old, tablename_new TO tablename;

Неактивен

 

#6 01.11.2009 13:49:18

MainVoid
Участник
Зарегистрирован: 30.10.2009
Сообщений: 5

Re: Перевеод мультиязычной базы в UTF8

Спасибо большое за столь подробный ответ, Paulus.
Сегодня буду пробовать

Неактивен

 

#7 01.11.2009 18:13:59

MainVoid
Участник
Зарегистрирован: 30.10.2009
Сообщений: 5

Re: Перевеод мультиязычной базы в UTF8

При просмотре арабской части базы или при просмотре экспорта вижу белиберду.
При переключении кодировки браузера на windows-1256 (в которой она должна быть сохранена) вижу арабские символы, но беспорядочно разбросанные - т.е. опять белиберду.
Вопрос пока такой: как корректно выгрузить таблицу из базы с указанием кодировки?

Неактивен

 

#8 01.11.2009 23:25:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Перевеод мультиязычной базы в UTF8

Если под выгрузкой Вы понимаете «сделать выборку в текстовый файл», то простых
способов нету: Вы храните данные в кодировке cp1256 в таблице, которая подписана
кодировкой cp1251. При обычном резервном копировании данные конвертируются в
универсальную кодировку utf8 (а так как таблица подписана неправильно —
конвертируются тоже неправильно).

Самое близкое, что можно сделать — резервное копирование без конвертации
(mysqldump --default-character-set=cp1251), при этом в резервной копии таблица будет
подписана как cp1251 (т.е. там будет что-то типа CREATE TABLE tablename ... CHARSET cp1251),
если эти подписи исправить на 1256, то потом такая копия должна загрузиться правильно.
Но только арабские строки, остальные, разумеется, испортятся. Кстати, можно
экспортировать только арабские строки (параметр --where mysqldump). Но прокручивание
данных через файлики не избавит, увы, Вас от необходимости отдельно обрабатывать
два языка (latin1 совместим с cp1251, поэтому можно русские и английские строки обрабатывать
одним куском).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson