« 弟が亡くなって3年が経ちました | トップページ | CGI::Sessionと格闘中 »

2007/10/30

自作FrameworkとphpMyAdminの文字化け

自作Frameworkで更新したデータをphpMyAdminで表示させようとすると、なぜか文字化けしています。
とは言え、phpMyAdminで入力した日本語もmysqlで表示させると文字化けします。
うーん、放っておいても別に良いんだけど、「問題だと認識していながら放置してはいけない」と散々言ってきているので、きちんと調べてみました。

まず、環境は以下です。
PC : Pen3 1GHz, RAM 256RAM, HDD 40GB
OS : Fedora6(MySQLとRubyは標準で入っているものを使用)

調べてみると、MySQLではサーバーとクライアントで使用している文字コードが違うと、内部で変換して表示するらしい。ということで、これらの使用する文字コードを強制してみます。

# sudo vi /etc/my.cnf
...中略...
[mysqld]
default-character-set=utf8
...中略...
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
# sudo /sbin/service mysqld restart

おぉ、自作Frameworkで入力した日本語が全部文字化けしてる...
ということで、データを移行しなくてはなりません。以下のコマンドでバックアップデータを作成します。
* 表示上、改行してありますが一つのコマンドです。

# mysqldump -u [username] --default-character-set=utf8
   [databasename] > output.sql

バックアップデータを開いて、

CREATE TABLE `books` (
  `id` int(11) NOT NULL,
  `name` varchar(256) NOT NULL,
  `writer` varchar(256) NOT NULL,
  `category` varchar(256) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
上記の赤い部分を修正。
# mysql -u [username]
mysql> drop database [databasename]
mysql> ¥q
# mysql -u [username] [databasename] < output.sql
これで、phpMyAdminの文字化けは修正完了。嘘でした。これだけではだめです。
mysqldumpで出力したものはMySQL用の情報が埋め込まれていて、そこに文字コードを保存しているようで、テーブルの宣言部分とデータ部分だけを取り除いて、加工したものを使ってリストアする必要がありました。

今度は自作Frameworkです。
MySQLでは使用する文字コードをあらかじめ宣言する必要があるらしいので、データベースと接続するとすぐに文字コードをUTF-8と指定する事にします。
「dbconnect_mysql.rb」を以下のように改造。

...略...
  def open(host, user, pass, database)
    
    @db = Mysql.new(host, user, pass, database)
    @db.query("set names utf8")
    
  end
...略...

これで修正完了。きちんと文字化けしないで使えるようになりました。
他にも「削除の確認画面追加」や「SELECTフォームの整列方法追加」など、小さな改造を加えてあります。また、Webrickでもmod_rubyでもスクリプトに変更を加えないで使用できるようにもなりました。

ということで、興味のある方は下記リンクよりダウンロードしてみて下さい。

「framework4.zip」をダウンロード

また、おかしなところがあればご指摘頂けると幸いです。

|

« 弟が亡くなって3年が経ちました | トップページ | CGI::Sessionと格闘中 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/79953/16917708

この記事へのトラックバック一覧です: 自作FrameworkとphpMyAdminの文字化け:

« 弟が亡くなって3年が経ちました | トップページ | CGI::Sessionと格闘中 »