1. TOPTOP
  2. Webサービス
  3. CakePHP

即戦力になるためのPHPシステム開発の教科書で気がついたMySQLの日本語設定について

|

mysql

現在、Webアプリケーションフレームワークについて、即戦力になるための PHPシステム開発の教科書を写経しながら学習しております。

そのときに気付いたことのメモ書きです。本に書いているとおりでは、日本語の表記ができなかったので、MySQLの設定を独自に変えてみたというお話です。

元々のmy.cnf(設定ファイル)の内容

本の内容では、データベースで日本語を扱えるようにするため、my.cnfに3か所の追記をするように書かれています(P23)

[mysqld]
character-set-server = utf8

[mysql]
default-character-set = utf8

[mysqldump]
default-character-set = utf8

これらを追記すると、my.cnfは次のような感じになります。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
character-set-server = utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

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

[mysqldump]
default-character-set = utf8

しかし、これだと画面を表示すると、英数字は正しく表示されますが、日本語はすべて「???」で表示されることになります。

mysql_utf8

データベース内部の文字は、日本語で正しく表記されていたため、データベースからCakePHPにデータを渡すときの、文字コードの設定がされていなかったと推測されます。

日本語を正しく表記させるためのmy.cnf

では、データベース内部の文字を、CakePHPで正しく反映させるためには、どうすれば良でしょうか?最初で追記した内容に加えて、さらに2つのセクションで、次の追記が必要です。

[client]
default-character-set=utf8

[mysqld]
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

my.cnfの内容は次のようになります。

[client]
default-character-set=utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
character-set-server = utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set = utf8

このようにすると、下の画像のように、日本語も正しく表示されます。

mysql_utf8_2