とあるセクシーなデータ分析官

を目指す渋谷で働くソーシャルゲーム分析者の卵

DBの文字化け(UTF8)対応

mysqlへデータをインポートしたら文字化けた!」
mysqlに入り"select * from hogetebal where name "をしたら
??????という表記のものばかり表示された。
文字化けっぽいので対策を

対処1 デフォルトの文字コードの設定をutf8に
/etc/my.confの修正

[mysqld]
default-character-set=utf8
character-set-server=utf8
↑最後にこの2行を追記する


保存してmysql再起動
/etc/rc.d/init.d/mysqld restart


と思ったら停止はOKでたけど起動にNGが!
そゆ時はエラーログを見ればおkってことだったのでログをみるとutf8の記述が間違っていますよと。
my.confを確認したら"〜=utf8;"と…セミコロンいらないやん!とPHPの癖によるミスでした><


修正するとmysqlが起動したので、select文で文字化けしてないか見てやると、依然として文字化け。
デフォルトの設定をしただけなので、既存のは当然代わってないですよねw
対処2につづく。



対処2
次に、既存のDBの文字コードを変換する。
既存のDBの文字コードを変換するというぐらいだから、
DB個別にUFT8にしていくと思い、
mysql> set hogedb utf8;


ERROR 1193 (HY000): Unknown system variable 'hogedb'…


あれれ〜?と思い、サイトに書いてあった通り
mysql> set names utf8;
とするとすんなりOKが出ましたww


なんだ、namesで全部のDBをUTF8にしてくれるんですね便利便利。


確認のためSELECT文を発行したらちゃんと文字化けしないで返してくれましたよ!
と思ってやっていたら、mysqlから一回出て入りなおすとまた文字化けしている…
対処3につづく。



対処3


文字コードの現状を確かめるために下記のコマンドを打つ
mysql> show variables like "char%";

                                                                                                                • +
Variable_name Value
                                                                                                                • +
character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_results latin1
character_set_server utf8  
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
                                                                                                                • +


ほかの部分がuft8になっていないから同じことを繰り替えしていたっぽい。


[mysqld]
skip-character-set-client-handshake
↑この一行を追加で解決


ところがどっこい、もってくる時はいいのだが
アプリ側から問い合わせる時に文字化けが起きる…


対処4へつづく。



対処4
・DBの再構築
まずはDBの削除。そしてDBのcreate。ここでutf8を指定してやる
CREATE DATABASE データベース CHARACTER SET utf8 COLLATE utf8_bin;
そしてテーブル情報とデータをインポートを普通にやって
すべての文字化け対策完了。


問題なく動いております。めでたしめでたし。


参考文献(対処1・2):http://it.kndb.jp/entry/show/id/15
参考文献(対処3):http://wota.jp/ac/?date=20061011
参考文献(対処4):http://bluedb.org/ajax/archives/26