2008年2月アーカイブ

Ruby on Railsで作成したWebアプリケーションで日本語の値を扱うには、MySQL側とRuby on Rails側で、日本語の設定を行う必要があります。

 

■■MySQL側の設定

MySQLでcharacter_setの値を確認します。

MySQLに接続し、「show variables like 'character_set%';」で確認可能です。

# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql>

latin1だと、日本語の値をセットすると????と文字化けしてしまうので、utf8に設定します。

/etc/my.cnfにdefault-character-set = utf8を設定します。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8

[mysql.server]
user=mysql
basedir=/var/lib
default-character-set = utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8

[mysql]
default-character-set = utf8

 

再度確認すると、utf8になった事が分かります。
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql>

character_setがutf8になりました。
ただ、latin1の設定の状態でcreate databaseとcreate tableを実施していたので、上記ではその部分の設定までは変わりません。

■データベースの文字セット

use [データベース名]で、データベースに接続すると、character_set_databaseがlatin1になっているのが分かります。

mysql> use [データベース名]
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

statusコマンドでも、確認可能です。Db charactersetがlatin1になっています。

mysql> status
--------------
mysql  Ver 14.12 Distrib 5.0.27, for redhat-linux-gnu (i686) using readline 5.0

Connection id:          28
Current database:       [データベース名]
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.27
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 19 min 15 sec

Threads: 4  Questions: 1551  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 9  Queries per second avg: 1.343
--------------

mysql>


データベースの文字コードを変更するには、alter databaseコマンドを使います。

mysql> alter database [データベース名] default character set utf8;
Query OK, 1 row affected (0.00 sec)

データベースの文字コードもutf8になった事が分かります。

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql>

 

■カラムの文字セット

上記で、データベースの文字コードを変更しても、それ以前に作ったカラムの文字コードの設定は変わりませんでした。
「show create table [テーブル名];」コマンドで確認すると、titleというカラムの文字コードがlatin1として作られているのが分かります。

mysql> show create table articles;
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                      |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| articles | CREATE TABLE `articles` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `number` int(10) unsigned NOT NULL,
  `title` varchar(200) character set latin1 NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

カラムの文字コードを変えようと、alter tableコマンドを何回か試してみましたが文法エラーになってよく分からず。。結局テーブルはdrop、createで作り直す事で、カラムの文字コードもutf8にする事ができました。

参考URL
http://phpspot.net/php/pgMySQL4.1%8CnUTF-8%82%CC%8F%EA%8D%87.html
http://jamy.to/jamyto2/bbs/index.jsp?page=5
http://dev.mysql.com/doc/refman/4.1/ja/alter-table.html

 

■■Ruby on Rails側の設定

config/database.ymlに、encoding: utf8 の記述を追加します。

参考URL

http://webos-goodies.jp/archives/50713859.html

# MySQL (default setup).  Versions 4.1 and 5.0 are recommended.
#
# Install the MySQL driver:
#   gem install mysql
# On MacOS X:
#   gem install mysql -- --include=/usr/local/lib
# On Windows:
#   gem install mysql
#       Choose the win32 build.
#       Install MySQL and put its /bin directory on your path.
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
  adapter: mysql
  database: [DB名]
  username: [ユーザー名]
  password: [パスワード]
  socket: /var/lib/mysql/mysql.sock
  encoding: utf8

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
  adapter: mysql
  database: [DB名]
  username: [ユーザー名]
  password: [パスワード]
  socket: /var/lib/mysql/mysql.sock
  encoding: utf8

production:
  adapter: mysql
  database: [DB名]
  username: [ユーザー名]
  password: [パスワード]
  socket: /var/lib/mysql/mysql.sock
  encoding: utf8

 

また、上記だけでダメな場合は、app/controllers/application.rbを下記のように書き換えるとよい場合もあるようです。
(MySQLが原因である事を切り分けられていない段階で、下記対応も見つけました。僕の場合は下記対応をしなくても日本語を正しく表示できました)

参考URL
http://ruphus.com/blog/2005/06/23/getting-unicode-mysql-and-rails-to-cooperate/

# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.

class ApplicationController < ActionController::Base
  # Pick a unique cookie name to distinguish our session data from others'
  #session :session_key => '_blognavi_session_id'
  before_filter :set_charset
  before_filter :configure_charsets

  private

  def set_charset
    @headers['Content-Type'] = 'text/html; charset=UTF-8'
  end

  def configure_charsets
    @response.headers["Content-Type"] = "text/html; charset=utf-8"
    # Set connection charset. MySQL 4.0 doesn't support this so it
    # will throw an error, MySQL 4.1 needs this
    suppress(ActiveRecord::StatementInvalid) do
      ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
    end
  end
end

Ruby on RailsとMySQLを再起動し、日本語の値をセットする事ができるようになりました。

RedHat Enterprise Linux 4では、セキュリティ上、導入直後はFTPとTelnetが使えない状態です。
SSHでリモートログイン、ファイル転送共に可能ですが、テスト環境等で利便性を優先し、FTPとTelnetを使いたい場合は下記の手順で有効にする事ができます。

アプリケーション>システム設定>サーバ設定>サービス
のサービスの設定画面から、下記にチェックを入れて保存します。

gssftp
krb5-telnet

Telnetは上記のみでOKですが、FTPは、上記だけだとユーザー名入力時に下記のエラーが出て接続できません。

530 Must perform authentication before identifying USER.
Login failed.

下記の設定ファイルをテキストエディタで変更します。

/etc/xinetd.d/gssftp

【変更前】
server_args     = -l -a

【変更後】
server_args     = -l

その後、xinetdを再起動して、変更が有効になり、FTPアクセスが可能となります。
/etc/rc.d/init.d/xinetd restart
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]

 

ADs by Google

このアーカイブについて

このページには、2008年2月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年1月です。

次のアーカイブは2008年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01