UJISのMySQLにUTF8で入れてしまっていたDBをUTF8のDBに移行

NO IMAGE

最近SQLとかわかってきたのでこのブログで使っているMySQLを覗いたところ
文字化けで意味不明状態になっていた
なので原因を探ってみた
ついでにBlognPlusのモジュールのキャッシュをONにすると文字化けするのもこのせい
OSはVineLinux4.2
MySQLをujisにて構築
[client]
default-character-set=ujis
[mysqld]
skip-character-set-client-handshake
default-character-set=ujis
default-collation=ujis_japanese_ci
[mysqldump]
default-character-set=ujis
[mysql]
default-character-set=ujis

当然データベースもujisとなる
phpもVineLinux4.2なのでujisでビルドされているはず
しかしphpでのマルチバイト文字の処理はUTF8にしている
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8

この状態だとPHPアプリ上は得に文字化けしない
全てujisなので文字変換は行われず入力されたものがそのままデータベースに入る
出力も同様
しかしDBを覗くと文字化けが発生している
HEXを見たところUTF8のコードでそのまま格納されていた
PHP上はOKだけど他はDBの設定通りujis文字で表示しようとするのでダメというわけです
全然理解していない頃にとりあえず動けばいいということで構築したのが原因
これだとメンテナンス性が落ちるのでUTF8に移行したい
まずはmysqldumpで移行するDBを出力
mysqldump -u ユーザー名 -p 移行するDB名 > 出力ファイル
バイナリエディタのStirlingにてujisをutf8に文字列置換
これで元々utf8のデータベースであったかのようなダンプができる
でもって
[client]
default-character-set=utf8
[mysqld]
skip-character-set-client-handshake
default-character-set=utf8
default-collation=ujis_japanese_ci
[mysqldump]
default-character-set=utf8
[mysql]
default-character-set=utf8

にしてMySQLを再起動
mysqld restart
起動しない
default-collation=ujis_japanese_ci
が不要
削除して
mysqld start
無事起動
MySQLに接続
mysql -u ユーザー名 -p
そして移行したいデータベース
Drop Database 移行したいデータベース;
Create 移行したいデータベース;

これでUTF8のデータベースが出来上がる
中身も戻したいので
mysql -u ユーザー名 -p 移行するDB名 < 出力ファイル
これで無事以降完了
もちろんBlognPlusのモジュールのキャッシュをONにしても文字化けはしなくなった