現在、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は次のような感じになります。
[php]
[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
[/php]
しかし、これだと画面を表示すると、英数字は正しく表示されますが、日本語はすべて「???」で表示されることになります。
データベース内部の文字は、日本語で正しく表記されていたため、データベースから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の内容は次のようになります。
[php]
[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
[/php]
このようにすると、下の画像のように、日本語も正しく表示されます。