« FAQについて思うこと | Main | Linuxでそこそこ安全かつ楽にサーバを立てる方法 »

August 02, 2007

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を使いました。

|

« FAQについて思うこと | Main | Linuxでそこそこ安全かつ楽にサーバを立てる方法 »

データベース」カテゴリの記事

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

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/32004/15983601

Listed below are links to weblogs that reference MySQLのデータをシフトJISからUTF-8に変換した際の記録:

« FAQについて思うこと | Main | Linuxでそこそこ安全かつ楽にサーバを立てる方法 »