MySQL関連で文字化けを治す方法

 MySQL関連で文字化けをすることがありますが、それを直す方法をいくつか紹介します。
 文字化けの原因は一言でいうと「文字コードが統一されていない」ということに尽きるので、少なくとも文字コードを統一すれば文字化けは基本的に治ります。(ここではあえて、「直る」ではなく「治る」にしておきましょう。)ここ最近の文字コードはUTF-8がメジャーになってきているので、UTF-8の設定方法を例にしていきたいと思います。
 文字化けを治す作業には以下の二つしかありません。
  1. 現在の文字コード情報を得る。
  2. 文字コードを設定する。
 これだけしかないのですが、Web関連のスクリプト、サーバーサイドでの操作、またはMySQLを端末で直接操作するなど様々な経路と状態が存在するので大切な部分だけ紹介します。

MySQL自体の文字コードを設定

 まずは、MySQLで有効な文字コードを確認します。
mysql> show variables like 'character_set%';
 このコマンドで文字コードの一覧が出るのでどの部分にどの文字コードが設定されているのかわかると思います。
mysql> show variables like 'character_set%';
Connection id:    975
Current database: test_database

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
  この文字コードはMySQLの/etc/mysql/my.cnfに書かれている設定に由来します。このファイル内に、
default-caracter-set = utf8
と書かれた部分を探します。もしこの行がなかったら、この行をmysqldumpとmysqlのセクションに追加してMySQLを再起動します。
[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

# オリジナルの設定(文字コードを追加)
default-character-set = utf8

[mysql]
#no-auto-rehash    # faster start of mysql but no tab completition

# オリジナルの設定(文字コードを追加)
default-character-set = utf8
 これがMySQL自体の文字コードの設定となります。SHIFT-JISやEUC-JPの場合は、そのも文字コードを設定します。
  • utf8:UTF-8を指定するとき。
  • sjis:Shift JIS を指定するとき。
  • ujis:EUC JP を指定するとき。

データベースの文字コードを設定

 データベースにそれぞれの文字コードを個別に割り振ることもできます。MySQL自体に設定された文字コードはあくまでもdefaultなので、何も設定されなかった場合に適用される文字コードです。ですので文字化けが発生した場合もデータベースそれ自体の文字コードを確認する必要があります。
mysql> show create database データベース名;
 データベースで設定された文字コードが表示されるので確認してみてください。
mysql> show create database test_database;
+---------------+------------------------------------------------------------------------+
| Database      | Create Database                                                        |
+---------------+------------------------------------------------------------------------+
| test_database | CREATE DATABASE `test_database` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+---------------+------------------------------------------------------------------------+
1 row in set (0.00 sec
 データベースの文字コードを明示的に設定する場合、新規でデータベース作成の際に同時に設定します。(既存のデータベースの文字コードを変更することはできますが、これまでのデータを壊しかねないので新規で作成したデータベースに新しいデータを流し込んだ方が安全です。)
 データベースを新規で作成する時に明示的に文字コードを設定します。
mysql> create databaase <データベース名> default character set utf8;
 ここまででMySQLのデフォルトの文字コードとデータベース個々の文字コードが統一されます。また設定した文字コードはデータベースのファイル保存場所(たいていの場合、/var/lib/mysql/<データベース名>)にdb.optファイルとして設定した文字コードが書き込まれています。
default-character-set=utf8
default-collation=utf8_unicode_ci

テーブルの文字コードを設定する

 テーブルを作成する際にも文字コードを個々に設定が可能です。現在のテーブルの文字コードを表示する方法は、
mysql> show create table <テーブル名> \G
テーブルに関する様々な情報を表示するコマンドで、カラムのデータ型、テーブルのストレージエンジン(テーブル型)などが表示されますが、文字コードも表示されます。
mysql> show create table test_table;
 ...(省略)... ENGINE=MyISAM DEFAULT CHARSET=utf8 |
1 row in set (0.00 sec)
 テーブルの文字コードを変換したり変更したりすることはできません。もしテーブルの文字コードを変更・設定したい場合は、データベースを作成する際に設定した文字コードが反映されます。つまりデータベースで設定された文字コードはすべてのテーブルに直接反映します。

MySQLの再起動

 MySQLで(/etc/mysql/my.cnf)文字コードを設定した場合は再起動します。再起動しないと設定した文字コードが反映されません。
/etc/init.d/mysql restart
# /etc/init.d/mysql restart
 * Stopping MySQL database server mysqld [ OK ]
 * Starting MySQL database server mysqld [ OK ]
 * Checking for corrupt, not cleanly closed and upgrade needing tables.

 文字化けが発生する場所は実に様々です。phpを利用してデータベースに接続し、Web上にデータを表示させた場合にデータベースから引っ張ってきたデータが文字化けしてしまうとか、CMSを使用した際にWebページの表示は正しくされるのに管理画面が文字化けしてしまう、またPHPMyAdminなどのWeb上でMySQLを管理するアプリケーション上で日本語だけ文字化けしてしまう、端末からMySQLに接続すると挿入したデータや読み込んだデータが文字化けしてしまうなど、実に様々です。これらの原因は、それぞれの部署で文字コードが統一されていないために起こります。phpではmb_convertなどの関数で外から入力されたPOSTデータなどを正しい文字コードに変換できますし、またMySQLのデータも読み込む際に文字コードを指定してあげると違った文字コードで読み上げることもできます。しかし、これらを統一しないとどこか思わぬ箇所で文字化けが起こりかねないわけです。設定する際には充分注意しましょう。






プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer