mysqlで文字コードをutf8にセットする


mysqlの文字コードはチェックする場所が多いので原因を突き止めるのに毎回苦労します。
大きく二種類に分けられて、

  1. クライアント側、サーバー側(mysqlサーバー)、及びそれらの接続の文字コード
  2. データベース/テーブル/カラムの文字コード

です。

デフォルトをきちんと設定しておく

そもそも作成したDBの文字コードが意図しない設定になっていたら、デフォルトの設定が間違っている可能性が高いので、再度同じ問題を起こさないためにも、設定見直し→DBをdrop→DBをcreateという順番で直しに行きます。

1も2もデフォルトの設定は下記を実行すればok。

show variables like "chara%";
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
  • character_set_client : クライアント側で発行したsql文はこの文字コードになる
  • character_set_connection : クライアントから受け取った文字をこの文字コードへ変換する
  • character_set_database : 現在参照しているDBの文字コード
  • character_set_results : クライアントへ送信する検索結果はこの文字コードになる
  • character_set_server : DB作成時のデフォルトの文字コード
  • character_set_system : システムの使用する文字セットで常にutf8が使用されている

基本的にはこれを全部(character_set_filesystem, character_sets_dir以外)utf-8にすればok。

utf8に設定する

変更するには設定ファイルに書き込む。

/etc/my.cnf
[mysqld]
...
character-set-server=utf8 #mysqldセクションの末尾に追加

[client]
default-character-set=utf8 #clientセクションを追加

再起動。

/etc/init.d/mysqld restart

文字コードの確認をする

再度データベースを作りなおしたらきちんと文字コードが設定されているか確認します。

サーバー/データベース

use文をつかってDBを指定し、クライアント、接続部分、データベースの文字コードが正しく設定されているか確認します。

use db_example;
show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | #utf8になってるok!
| character_set_connection | utf8                       | #utf8になってるok!
| character_set_database   | utf8                       | #utf8になってるok!
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

テーブル/カラム

作成されたテーブルの文字コードを確認します。

mysql> show create table tb_example \G; 
*************************** 1. row ***************************
       Table: location
Create Table: CREATE TABLE `tb_example` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #utf8になってるok!