LINUX.ORG.RU
ФорумAdmin

MySQL: cp1251 -> latin1(utf8 ???). Как обратно ?


0

0

Ситуация типовая: дамп базы в ср1251 был вставлен в MySQL 4.1.х, при не выставленном чарсете, так что теоретически все работало под latin1. Однако данные были преобразованы, видимо под utf8. Во всяком случае, обратный дамп выдает уже другие данные.
Проблема в том, что данные эти как utf8 никем не понимаются. iconv ругается на превый же отличный от верхней половины ASCII символ как на недопустимый. При попытке получить данные с --set-charset={cp1251,utf8} получается либо вопросы, либо абракадабра соответственно.
Самое странное, что пхп смело берет и выдает эти данные как cp1251.

Вопрос: в каком виде сейчас хранятся данные и можно ли их как-то спасти ? (С базой уже работали.)

★★★★★

подключись к базе, потом пойграйся с set names XXX (XXX - кодировка) и select какого-нить текста из таблицы. Что получается?

babai
()

убрать все чарсеты так чтобы база работала по умолчанию в latin1
сделать mysqldump --default-charset=latin1 (параметр возможно уточни)
поднять mysql так как тебе надо, в смысле чарсеты
исправить dump в настройках таблиц latin1 на действительную кодировку файла.
в начале дампа раскоментировать set names действительная_кодировка
залить дамп

поправить php скрипты после подключения добавить set names

anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous2

> исправить dump в настройках таблиц latin1 на действительную кодировку файла

Вот именно этот то вопрос меня и занимает - какова стала действительная кодировка данных ?

LamerOk ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

если дамп cp1251 был выставлен в таблицы latin1 и php их понимает без проблем,
то вариант mysqldump --default-character-set=latin1 > base.sql выдаст тебе тот самый желанный результат в cp1251, который можно конвертировать в другие кодировки.
Но тот же самый вроде вариант mysqldump | iconv -flatin1 свалится обязательно.
Далее, можно сделать iconv -fcp1251 -tutf8 base.sql
Заменить к примеру все latin1 на utf8, раскомментировать set names utf8,
залить обратно и база будет в utf8.

Но скрипты по умолчанию уже просто так работать не будут.

anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous2

> вариант 
> mysqldump --default-character-set=latin1 > base.sql
> выдаст тебе тот самый желанный результат в cp1251

Вся проблема заключается именно в том,
что выдает он совсем не ср1251. И не latin1.
Он выдает нечто похожее на utf8, но я не могу
его прочитать никаким просмоторщиком, понимающим
этот самый utf8.

Вот кусочек шестнадцатиричного дампа:

0000960: 362c 302c 27c3 a4c3 bbc3 b0c3 a5c3 b5c3  6,0,'...........
0000970: b2c3 b3c3 b027 2c27 272c 2727 2c27 272c  .....','','','',
0000980: 2727 2c27 272c 2727 2c27 3030 3030 2d30  '','','','0000-0
0000990: 302d 3030 272c 302c 3029 2c28 382c 302c  0-00',0,0),(8,0,
00009a0: 2727 2c27 c388 c3a2 c3a0 c3ad c3ae c3a2  '','............
00009b0: 20c3 88c3 a2c3 a0c3 ad20 c388 c3a2 c3a0   ........ ......
00009c0: c3ad c3ae c3a2 c3a8 c3b7 272c 2727 2c27  ..........','','
00009d0: 272c 2727 2c27 272c 2727 2c27 3030 3030  ','','','','0000
00009e0: 2d30 302d 3030 272c 302c 3029 2c28 3131  -00-00',0,0),(11
00009f0: 2c30 2c27 272c 27c3 91c3 a5c3 b0c3 a0c3  ,0,'','.........
0000a00: a2c3 a8c3 ad20 c38c c3a8 c3b5 c3a0 c3a8  ..... ..........
0000a10: c3ab 20c3 82c3 abc3 a0c3 a4c3 a8c3 acc3  .. .............
0000a20: a8c3 b0c3 aec3 a2c3 a8c3 b727 2c27 2838  ...........','(8

LamerOk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.