Linux 上に構築した LAMR 環境にて,ActiveRecord を利用して Ruby から MySQL を操作していたのですが,日本語が化けてしまう現象に遭遇しました。
そもそも文字コードのことを何も気にしていなかったので化けて当然ではありますが,勉強用に買った「初めての Ruby」のマルチバイト文字に関する説明をじっくりと読み,以下の記述を見つけました。
Ruby の 1.8 までのバージョンでは,文字列は単なるバイト列に過ぎません。
・・・
Ruby の大部分の機能は欧米生まれの古いプログラミング言語たちと同様に,文字エンコーディングが ASCII だけであるかのように無造作に文字列を操作するのです。
・・・
Ruby 1.8 で国際化や多言語化が必要なプログラムを作成する場合,Unicode 文字集合の多言語表現能力に頼るスタイルが主流です。ソースファイルおよびデータには UTF-8 を使用し,プログラム内部では一貫して UTF-8 を使用します。そして,外部との入出力の際にだけ必要に応じてコード変換を行います。
そこで,すべてを UTF-8 で統一することにしました。Ruby のソースコードはもとから UTF-8 だったので,MySQL の設定を UTF-8 に変更します。
まず,my.cnf を次のように修正して,すべてに UTF-8 指定を入れました。
[client] default-character-set=utf8 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql old_passwords=1 default-character-set=utf8 [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid default-character-set=utf8 [mysql] default-character-set=utf8
my.cnf の修正を終えたら MySQL を再起動し,mysql コマンドを実行して変数を出力・確認しました。
mysql> show variables; | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 |
そして最後に,ActiveRecord で接続時に UTF-8 を指定する encoding パラメータを追加しました。
ActiveRecord::Base.establish_connection( :adapter => 'mysql', :host => 'hostname', :username => 'username', :password => 'password', :database => 'my_db', :socket => '/var/lib/mysql/mysql.sock', :encoding => 'utf8' )
上記の作業を行ったら文字化けしなくなり,日本語を扱えるようになりました。
関連エントリー
ActiveRecord単体を使用するアプリ開発で文字化けが起こりこまっていましたが、ご紹介いただいた”ActiveRecord で接続時に UTF-8 を指定する encoding パラメータを追加”で正常動作しました。ありがとうございました。
お役にたって良かったです。
最近はRuby を使っていないのですが、まだこの様な問題があるんですね。