Попалась большая mysql база в cp1251, которую нужно залить в PostgreSQL в utf8

Не знаю откуда в 2014 коду берутся люди, которые используют cp1251, но эти извращенцы еще существуют.

В общем, чтобы залить mysql базу в постгрес, в нормальной кодировке, я сделал так —

Файл kp.sql — исходная база.

iconv -f CP1251 -t UTF-8 kp.sql >kp_utf8.sql # сконвертим в utf8 текст дампа

cat kp_utf8.sql|sed s/cp1251_general/utf8_unicode/g |sed s/cp1251/utf8/g > kp_utf8_fix.sql # пофиксим cp1251

В консоли mysql —

create database kp;
use kp;
source kp_utf8_fix.sql; # заливаем дамп

Ок. Теперь выгружаем дамп для заливки в постгрес. Отдельно схему и данные:


mysqldump -u root -p --compatible=postgresql --no-data --default-character-set=utf8 kp -r kp_postgres.sql
mysqldump -u root -p --compatible=postgresql --no-create-db --no-create-info --default-character-set=utf8 kp -r kp_postgres_data.sql

Теперь нужно поправить схему для соответствия типа колонок в постгресе. Можно ручками или спец. утилитой.
Я воспользовался утилитой — SQLFairy
В убунте она находится в пакете libsql-translator-perl

Фиксим дамп схемы:


sqlt -f MySQL -t PostgreSQL kp_postgresql.sql > kp_pg_schema_fixed.sql

Загружаем схему в постгрес —

psql -h server -d databasename -U username -f kp_pg_schema_fixed.sql # server, databasename, username ставите свои.

Смотрим были ли ошибки — если нужно фиксим схему. Мне были нужны только данные, поэтому на ошибки ключей и индексов я не обращал внимание.

Теперь нужно загрузить данные. MySQl выгружает в режиме совместимости с PostgreSQL но не совсем в совместимом режиме =).
Поэтому в файл kp_postgres.sql вначале добавляем строки:

SET standard_conforming_strings = 'off';
SET backslash_quote = 'on';

Если дамп большой (как был у меня), то проще всего сделать так:

(echo 'SET standard_conforming_strings = 'off';
SET backslash_quote = 'on';
'; cat kp_postgres.sql) > kp_pg_data_fixed.sql

Ок дамп готов, загружаем в постгрес.


psql -h server -d databasename -U username -f kp_pg_data_fixed.sql # server, databasename, username ставите свои.

PostgreSQL при загрузке будет сыпать HINTы — пофиг на них. Загружается очень медленно, но для меня это было не принципиально.

Усе.