QA@IT

MySQL + ActiveRecordでUTF-8が文字化け

6511 PV

現在、ActiveRecordを生で(Railsを使わないで)使っているのですが、文字化けが発生してしまいます。
DBはMySQL、OSはUbuntuを使っています。

以下に具体的なソースを書かせていただきます。

# -*- encoding: utf-8 -*-
require "active_record"
require "./models/talk.rb"
ActiveRecord::Base.establish_connection(
  :adapter  => "mysql2",
  :host     => "localhost",
  :username => "root",
  :password => "",
  :database => "development",
    port: 3306,
    socket: '/var/run/mysqld/mysqld.sock',
  :encoding => 'utf8'
)

jp = "あ"
p Talk.find(Talk.create(body:jp))

実行結果

<Talk id: 1001, body: "?", created_at: "2012-09-07 14:06:57", updated_at: "2012-09-07 14:06:57">

このようにbodyが"あ"をいれたはずなのに"?"になってしまいます。

次にMySQLのstatusを書かせていただきます。

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.1.63, for debian-linux-gnu (x86_64) using readline 6.1

Connection id:      50
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.1.63-0ubuntu0.10.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         22 hours 27 min 24 sec

Threads: 1  Questions: 21747  Slow queries: 0  Opens: 123  Flush tables: 1  Open tables: 26  Queries per second avg: 0.268
--------------

なぜこのように文字化けしてしまうのでしょうか?ご回答いただけると幸いです。

  • 列の文字コードが UTF-8 でないということはありませんか? 差し支えなければ `SHOW CREATE TABLE talks;` の結果を載せてください。 -

回答

日本語であるべき文字が「?」として表示されるのは2つのパターンがあります。

  1. データ格納時に「?」に変換された
  2. データはちゃんと格納されているが、取得時に「?」に変換された

SELECT body, HEX(body) FROM talks; で HEX が 3F になっているとしたら、格納時に変換されてます。

もしそうであれば、テーブルの charset が utf8 になっていないかもしれません。SHOW CREATE TABLE talks でテーブルの charset を確認することができます。

編集 履歴 (0)
  • SHOW CREATE TABLE talksをするとDEFAULT CHARSET=latin1となっていました。そこでDataBaseを削除してもう一度作り直すとutf-8になりました。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。