LAMP環境で日本語を扱う-MYSQLの既存テーブルの文字コードを変更する方法

記事公開日:
最終更新日:

This post is also available in: English-US (英語)

VPSのLAMP環境で日本語を扱う方法、特に既に作成済みのデータベースの既存テーブルの文字コードを変更する方法についてのメモです。
既にテーブルに大事なデータが入っていたりする場合には、必ずMYSQLのバックアップを取った上で行ってください。
環境は PHP5.6 ubuntu 14.04 です。

MYSQLに保存された日本語が文字化けしている...

MYSQLに保存された日本語が全て「???」のような感じではてなマーク(エクスクラメーション)に文字化けする現象に遭遇しました。

最初、アプリケーション側かPHPの問題かなと思って、php.ini を編集したりしていたのですが、どうもMYSQLのデフォルトの文字コード(latin1_swedish_ci)の設定変更を忘れていたのが原因のようでした。
以下に、ざっと手順とコマンドをメモ代わりに書いています。

php-mbstringの導入・設定

php-mbstringはマルチバイト文字(日本語とか)を扱うためのPHP拡張モジュールです。

以下は、ubuntuでPHP5の場合のコマンドです。

sudo apt-get install php5-mbstring
#もしくはバージョン 5.x の指定で以下のコマンド
sudo apt-get install php5.x-mbstring

php-mbstringのインストール後、php.iniの編集を行います。

sudo vi /etc/php5/cli/php.ini

php.iniの編集内容は開発する案件によると思いますが、最低限以下の内容をphp.iniに追加(もしくはコメントアウトを外す)します...と書こうかと思ったのですが、内容がやたら長くなるので、リンク先のサイト様を参照してください。

日本語利用の為の設定(mbstring) | PHPインストールと初期設定

で最後に、忘れずにapacheをリスタートします。

sudo /etc/init.d/apache2 restart

php-mbstringが有効になっているかどうかは、以下のようなPHPスクリプトで確認できますので、作成したファイル(例では phpinfo.php)を、/var/www/html/ に置いてブラウザでアクセスして値を確認します。

/* phpinfo.php */
<?php
phpinfo();
?>

MYSQLデータベースのデフォルトの文字コード変更

MYSQLのデフォルトの文字コード変更の項目ですが、この項目部分を実行しても作成済みの文字コードは変更されません(次の項目で書いてます)

ですが、デフォルトの文字コード(latin1_swedish_ci)を変更しておかないと、追加でテーブルの追加などを行った際に困る可能性があります。
(ちなみに、utf8_general_ci,utf8_unicode_ci がありますが、日本語中心のシステムの場合 utf8_general_ci にしておく方が無難ぽいです。独立した新しいシステムとして導入する場合には、utf8mb4_general_ci,utf8mb4_unicode_ci も検討に入れるのが良さそうです。)

最初に、MYSQLのオプション設定ファイル(my.cnf)を開き(OSによって場所が違います)、下記のように追加します。

sudo vi /etc/mysql/my.cnf 
##my.cnf
# [client]の項目の最後に以下を追加
default-character-set=utf8
# [mysqld]の項目の最後に以下を追加
character-set-server=utf8

次に、以下のコマンドでMYSQLにログインし、MYSQLのデフォルトの値を確認します。

mysql -u root -p
mysql> show databases;
mysql> show variables like "chara%";

で、以下のようなコマンドで、既存データベースの文字コードの設定を変更します(既存データベース内の既存テーブルの文字コードはこれでは変更されません)。

#サンプルDB名:database_name
mysql> ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

変更後の「mysql> show variables like...」のレスポンスは以下のような感じになっているかと思います。

mysql_charactervariable

最後にMYSQLを再起動します。

sudo /etc/init.d/mysql restart

MYSQLの既存テーブルの文字コード変更

以下のコマンドでMYSQLにログインし、databasesの一覧そしてtableの一覧を確認し、テーブルの文字コードの確認を行うことができます。
テーブルの文字コードは「show table status...」コマンドで出てくる「 Collation 」の欄で確認できます。

mysql -u root -p
#サンプルDB名:database_name, サンプルテーブル名:table_name
mysql> show databases;
mysql> USE `database_name`;
mysql> show tables from database_name;
mysql> select * from table_name;
mysql> show table status from database_name like 'table_name';

そして、以下のようなコマンドで文字コードを変更したい既存テーブルを指定して、文字コードを変更します。

#サンプルテーブル名:table_name
mysql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

※MYSQLの既存テーブルの文字コードを一括で変更したい場合

既存テーブルの数が手作業では多すぎる場合に、以下のように一括でコマンドを生成できます(生成だけで実行していない)
以下のコードは、コマンドを生成しているだけで実行しているわけではありませんので、出力された結果をテキストエディタの文字列置換(\| を空文字に変換とか)とかで適宜編集して、実行してください。

#サンプルDB名:database_name
mysql> SELECT CONCAT('ALTER TABLE `', tbl.`TABLE_SCHEMA`, '`.`', tbl.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM `information_schema`.`TABLES` tbl WHERE tbl.`TABLE_SCHEMA` = 'database_name';

最後に忘れずにMYSQLを再起動します。

sudo /etc/init.d/mysql restart

About
Amelt.net,LLCの創業者で、費用対効果の高い統合webマーケティングによりビジネスパートナーとして継続的にサポート。詳しいより。ブログの更新情報TwitterLinkedIn、またRSSfeedlyにてお知らせしていますのでフォローよろしくお願い致します。