MySQLのデータをシフトJISからUTF-8に変換した際の記録
今回のエントリーは、先日Shift JISで作っていたデータを多言語対応にすべくUNICODEに変換しようとしたとき苦労した際の記録です。
今回対象としたのは、MySQLからdumpした100MB近くあるデータです。
【一通りの手順】
まずMySQLからデータをdumpします。
% mysqldump [database name] > dump.sql
次にdump.sqlをmoreしてみると「DEFAULT CHARSET=sjis」という記述があるのでこれをutf8に変更します。
% perl -p -w -e 's/sjis/utf8/g' dump.sql > dump2.sql
ただいくらDEFAULT CHARSETをutf8に変えても実際のデータがシフトJISなので、データ自体もUTF-8に変えます。
% iconv -c -f shift_jis -t utf-8 dump2.sql > dump3.sql
こうして完成したデータをMySQLに読ませてみてエラーが起きなければとりあえず作業完了です。
% mysql < dump3.sql
手順をまとめてしまうとまぁ上記の通りなんですが、文字コードをシフトJISからUTF8に変えてからMySQLに読み込ませてみると通らないという点非常に苦労しました。いろいろなところで説明されているようにシフトJISからUTF8に変換する際100%全く同じに変換できない、というのがその理由です。いろいろな方が何かしらの工夫で100%に近づけるよう努力してくださった成果がiconvやnkfなどの変換コマンドなわけですが、それらのコマンドを用いてもどうもSQL文の実行に影響ある箇所で文字化けが起こってしまっていたようです。データ量が少なければ発生箇所の特定まで行いましたが今回データ量が多くかつ重要なデータでもなかったのでそこまで特定せず、iconvコマンドに-cオプション(無効な文字を無視して無視して続行することができる)をつけてごまかしています。ちなみにiconvを試す前にはnkfを試しましたが、-cオプションに相当するオプションが存在しなかったようですのでiconvを使いました。
「データベース」カテゴリの記事
- 急いでいる人のためのMySQLのユーザ権限付与講座 (2010.10.12)
- MySQLアクセスはGUI派? それともCUI派?(2011.05.15)
- MySQLのSQLクエリーだけで棒グラフを表示する方法 (2010.11.02)
- MySQLでSLAVEサーバを作る方法 (2010.10.04)
- DBの時刻合わせに気をつけよう(2005.09.21)

Comments
UTF8変換したものを再度SJISに変換し、それとオリジナルのSJISのデータとのdiffを調べたら文字化けの場所の特定がしやすいのでは?
Posted by: tikarano | August 02, 2007 at 04:38 PM
コメントありがとうございます。diffを取って比較するというのはいいアイデアですね!
Posted by: sanonosa | August 02, 2007 at 07:45 PM