2016年2月8日月曜日

MySQLの闇 文字コードlatin1 | ライタス株式会社

とあるホスティングに構築しているMySQLを、システム構築込みで業者さんにリプレースを丸投げすることになり、その手伝いをするハメに陥っております。

担当さんが、現在とっているバックアップを、そのまま業者さんに渡したら、

「文字化けしているので、文字化けしていないデータを下さい」

と言われたらしく、なんとかしてほしいと頼まれてしまいました。
私、MySQLは専門外なんですけど。・゚・(ノ∀`)・゚・。


ソレぐらい何とかしろよ・・・・


しかも、本番リリースが翌週頭に(ry って感じなので、特急作業となりました。

さて、調べたところ、現在のデータベースの文字コードはlatin1という文字コードで作られているようでした。(調べる方法は以下)

> show variables like 'character_set%';

どうやら、latin1で作られている領域に、無理やりUTF8の文字コードのデータを突っ込んでいるようでして、
この風習は結構昔からあるみたいです。(今思えば無茶苦茶です なんで動くんだ・・・?)

ダンプしたファイルは、そのままではインポートできないらしく、結構困ったちゃんです。
最近は、ちゃんとUTF8がサポートされているようなので、作成時点で気がつけば、
大丈夫なんでしょうが、今回みたいなマイグレーションでは、ひどい目にあう確率UP。

というわけで、何とかしようと調べました。(結構事例ありますね・・・みんな苦労してるんだなぁ)
参考にしたサイトは以下のサイト。

http://d.hatena.ne.jp/kusakari/20071113/1194920895

まずは、ダンプを取ります。
コマンドは以下。

mysqldump -u root -–default-character-set=latin1 -c -n -d [DB名] > [ファイル名]

nkfコマンドを使って、latin1 -> utf8に変換すれば、なんとかなる・・・ということらしいので、
やってみたら、nkfコマンドがインストールされていませんでした。
サイトを参考にnkfをインストールして、

http://xn--w8jg1l6b1858ay57b.jp/kn03/kn0344.html#kn031031


以下のコマンドで変換します。

nkf -wE [変換前ファイル名] > [変換後ファイル名]

ファイルを開いてみて、UTF-8で開けたら出来上がりです。
インポートするときは、CHARSET=latin1 となっているところを、utf8に変更するのをお忘れなく。
文字列置換は、以下のコマンドでもできます。

sed -e s/latin1/utf8/ [変更前ファイル] > [変更後ファイル]


とりあえず、ダンプファイルを引き渡して、うまくいくことを祈ります・・・




本記事は、弊社代表のブログ記事なんでもIT屋の宿命からの転載です。

0 件のコメント:

コメントを投稿