アプリケーションでMySQLを利用していたのですが、日本語を使ったタイミングでエラーが発生してしまいました。
MySQLとは言わずもがなかもしれませんが、オープンソースのリレーショナルデータベースです。
MySQLではdatabaseごとに文字コードが設定されるのですが、こちらがlatin1になっており日本語が扱えずエラーを起こしました。
日本語を使えるようにするためdatabaseを作り直して文字コードを修正します。
MySQLのdatabaseの文字コードを確認する
まずは下記SQLを用いて現在の文字コードを確認します。
SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'test';
INFORMATION_SCHEMAとはMySQLのメタデータを格納する仮想のデータベースで、その中のSCHEMATAはMySQLの全schema情報を格納しています。
schemaはdatabaseの構造の情報を持っています。
このコードでは”test”databaseの”test”schemaの情報を抜き出そうとしています。
抜き出している情報はSCHEMA_NAME、DEFAULT_CHARACTER_SET_NAME、DEFAULT_COLLATION_NAMEの3つです。
SCHEMA_NAMEはスキーマ名、DEFAULT_CHARACTER_SET_NAMEはdatabaseのデフォルトの文字エンコードを決めるschemaの文字セットの名前、DEFAULT_COLLATION_NAMEは文字セットの照合順序(文字の並び順)を取得できます。
実行結果で”test”schemaのデフォルトの文字コードがlatin1、文字セットの照合順序がlatin1_swedish_ciになっていることが分かりました。
MySQLの設定を変更する
databaseが作成される時にデフォルトの文字コードが設定されてしまうので設定を変更します。
設定変更はMySQLの設定ファイルであるmy.cnfファイルを修正することで行います。
下記コマンドを実行してmy.cnfファイルを開きます。
vi my.cnf
開いたら[mysqld]セクションのcharacter-set-serverをutf8に修正してください。
vimエディタの使い方はここでは関係ないため割愛します。
[mysqld]
...
character-set-server=utf8
my.cnfファイルの[mysqld]セクションはMySQLの設定で使います。
そのセクションのcharacter-set-serverでMySQLのデフォルトの文字セットを指定できます。
ここではデフォルトの文字セットをutf8にしています。
MySQLのdatabaseを再作成する
MySQLのdatabaseの設定を書き換えればいいのですが、私の場合システムがまだ稼働前で再作成したほうがどの設定を書き換えるか判別しなくて済むため再作成しました。
稼動中のシステムで急に日本語に対応しなければならなくなった場合には影響範囲を見極めてテストした上で設定を変更してください。
下記コマンドでtestというdatabaseを削除します。
drop database test;
削除できたら改めてdatabaseを作成してください。
create database test;
これで文字コードがutf8のtestというdatabaseが作成できました。
一応この記事の最初に使ったコマンドで問題ないか確認しましょう。
SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'test';
DEFAULT_CHARACTER_SET_NAME、DEFAULT_COLLATION_NAMEがutf8になっていれば問題ありません。
これで日本語も扱えるはずです。