UJISのMySQLにUTF8で入れてしまっていたDBをUTF8のDBに移行
- 2009.06.09
- お役立ち
最近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にしても文字化けはしなくなった
-
前の記事
BASTARD!! 26巻買いました 2009.06.07
-
次の記事
エヴァ缶当たる気がしない 2009.06.15