前回の日記で「~」が「?」に文字化けすると書いてた件、無事に解決しました。原因がわかれば実は大した事ではなかった…。以下、同じような失敗をした人のために覚え書。
サイトを別のサーバに移す際にMySQLも文字コードをEUCからUTF-8に変えたんだけど、そのやり方が中途半端だったみたい。
- 旧サーバからデータをmysqldumpで落とす。このときは文字コードはEUC(ujis)だけど、dumpしたデータはUTF-8になっている(dumpは基本UTF-8で吐かれるっぽい)。
- 新しいサーバにMySQLインストール。デフォルトの文字コードはUTF8に。
- 新しいサーバにデータベースを作る。文字コードはUTF8で作成。
- dumpデータを新しいサーバにリストア。
- リストア後、各テーブルの文字コードがEUCだったので、UTF8に変更。Collationはutf8_general_ciに。
- 作業完了。
と言う感じのやり方だった。
これで「show variables like "char%";」で文字コードがUTF-8になっていたので、これでUTF8に移行完了だと思ってた。
…が、一つ問題があった。dumpしたデータは確かにUTF8なのだが、テーブル作成のSQL文に「このテーブルの文字コードはEUC」と設定されていた。いや、これも新しいサーバにリストアしたときにUTF8に変えている。が、よく考えるとリストアした後にUTF8に変えただけだ。
つまりUTF8に変える前にリストアしたテーブルのカラムはEUCで保存されているのである。現に新しいサーバのデータをmysqldumpで取ったら、
DROP TABLE IF EXISTS `modx_active_users`;
CREATE TABLE `modx_active_users` (
`internalKey` int(9) NOT NULL default '0',
`username` varchar(50) character set ujis NOT NULL default '',
`lasthit` int(20) NOT NULL default '0',
`id` int(10) default NULL,
`action` varchar(10) character set ujis NOT NULL default '',
`ip` varchar(20) character set ujis NOT NULL default '',
PRIMARY KEY (`internalKey`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Contains data about active users.';
「character set ujis」という文字が。つまるところ中途半端にUTF-8にして中身はEUCだったという_| ̄|○
解決法としてdumpしたファイルの中で「character set ujis」を片っ端から削除して再度リストアした。すると今度はちゃんとUTF8化されたようで「~」も文字化けしなくなった。
結局は自分のやり方がダメだったわけですが…。でもこの中途半端な状態で「~」が化けるってのも少し不思議。UTF8の「~」文字からEUCの「~」へのマッピングは特に問題ないような気も。逆だったら色々問題ありそうっぽい(ネットで調べた限り)。
どうでもいいけど「~」って「波ダッシュ(wave dash)」が正式名称らしい。普段は「にょろ」か「波線」だよね。
作成日:2007/02/20 03:06:02
※コメントスパムが届くようになったので投稿を中止しました。