Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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!
YusukeHigaki
株式会社ニコリーで代表をしております。起業当初は自分でも開発をしていたのですが、最近はCTO以下、自分より遥かに優秀なメンバーにバトンタッチし、もっぱら企画や営業周りを統括しています。自分で書いていた経験もあり、エンジニアという職種に対するリスペクトは絶大です。
http://ticktockblog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした