MySQLの文字コードでハマった話
初めての技術的な記事ですがかなり初歩的な話です.
現在練習でWebサイトを作っています.
とりあえずデータベースになんか入力すると
サイトに反映されるだけのところから作ってたのですが,
日本語を入力してもサイト上では「???」と表示されるという問題が生じてしまいました.
環境はAWSのRDSにデータベースを置いて,MySQLで管理,
なんでこれを使ってるのか?というと,
今度行こうと思ってるベンチャーのバイト先がコレらを使ってるからです.
文字化けを理由として考えられるのは次の通りかなーと
ホスト(AWS RDS)の設定の問題
- ParameterGroupの文字コードのミス
ParameterGroupの文字コードをutf8にしましょう.
具体的にはお好みのPrameterGroupを選択してから,
EditPatameterをクリック.
次の項目をutf8にしちゃいましょう.
character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server
コード(CakePHP)の問題
- database.phpのencodingのミス
フレームワークが違う場合とか使わない場合は全く知らないのだけれど,
encodingの設定を見直そう
CakePHPだとこんな
'encoding' => 'utf8'
'UTF8'とか'utf-8'とかじゃなくて'utf8'ですよー
データベース管理(MySQL)の設定の問題
はい,今回の一番詰まったとこです.
まずデータベースの文字コードの確認は
show variables like 'char%';
意味としてはシステムのステータスのうち'char'を含むやつだけを表示ってことだよ.
ここでcharacter_setから始まる要素がlatin1とかになってたらマズイやつです.
こんなコマンドを打とう.
alter database [データベースの名前] character set utf8
これで確認すればfilesystemとdir以外はutf8になるはず.
ちなみにserverはホストの方に依存するみたいだから,
再起動とかするとserverだけ'latin1"になっちゃう!とかなったら
ホストの方を確認しよう.
テーブルとテーブル内のカラムの文字コードの確認は
show create table [テーブルの名前] \G
最後の\Gを入れると見やすくなります.
テーブルの文字コードの変更は
alter table [テーブルの名前] charset=utf8;
カラムの文字コードの変更は
alter table [テーブルの名前] modify [カラムの名前] [データ型] character set utf8;
文字化けの問題になりそうなところはザッとこんなところだと思います.
ちなみにここまでuff8でやってきたけどsjisとか別なのが良い人は
全部文字コード統一しましょうね.
で結構な時間ハマってたんだけれど,
一通りテーブルとか作成してからデプロイして
文字コードのミスに気付いたので上記のような設定ミスがめっちゃありました.
今のテーブルとかカラムが一括で修正されるわけじゃないことに気付かず
こういうミスを起こしてしまったのです.
ちなみにデータベース直してからテーブルとかを作れば
ちゃんとデータベースで設定した通りの文字コードになります.
というわけで今回の教訓は
データベースの設定をしっかりしてからテーブルを作成することだと思います.
ちなみに今回の件を大学の友達に話したら
「そもそも日本語を使ってる日本が悪い」
とのこと
ンッン~名言だなこれは……
さて文字コード問題が解決したので
いい加減お試しWebサイトの作成に着手しようと思います.
またそれ関係の記事載せるかもしれません.
あと今回の件でアドバイスをくれたり手伝ってくれた
ゆきよ氏とRYOTA君ありがとうございました.
以上です.