Subscribed unsubscribe Subscribe Subscribe

mysqldumpを使って異なる文字コードのDBへテーブルを移行

デフォルトで"latin1"を使い続けていたDBのtableを、全部"utf8"に変更しようとした。
my.cnfで変更する前にmysqldumpでtable情報を取得しておき、my.cnfを変更、再起動。
すると日本語の部分が読めなくなる。
ここでdumpから復元しようと

$ mysql -u hoge -p fuga < dumpfile

とやっても、結局作成されるのは文字化けしたtableだった。
dumpの中の文字コードがおかしいのか?と色々変換しようとしてみたがうまくいかず。
結局、PerlDBI経由で復元することに。

#!/usr/bin/perl
use strict;
use warnings;

use DBI;

my $dbh = DBI->connect('DBI:mysql:hoge', 'fuga', 'piyo');
my $sql = "";
while (<>) {
    next if $_ =~ /^[\/-]/;
    $sql .=$_;
    if ($sql =~ /;$/) {
        $dbh->do($sql);
        $sql = "";
    }
}

dumpしたファイルを引数にこれを実行することでとりあえず文字コードの異なるDBへの移行ができた。
文字コードって難しい・・・