MySQLの文字コードを統一

MyBBに「文字コードがバラバラだよ!」と叱られて、今頃になってやっと設定。

my.cnfの設定

まずは設定前の状態を確認してみる。

my.cnfに次のように文字コードのデフォルト設定を追加。(文字コード設定以外の部分は全部省略。)

client以外にmysqlやmysqldumpのディレクティブにもデフォルト設定を追加している人がいるが、clientに定義した内容はmysqldを除くすべてのディレクティブに共通の設定となるため、clientにだけ書けば良い。

設定したらMySQLサーバを再起動する。

文字コードのデフォルトがちゃんと変更されているのを確認。

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

デフォルトを変更しただけではテーブル内に保存されているデータの文字コードまでは変換されないので、テーブルは別途変換する必要がある。

文字コードの確認

データベースのデフォルト文字コードは、次のようにして「show create table <データベース名>」で確認できる。

同様に、テーブルも次のようにして「show create table <テーブル名>」で確認できる。

CHARSET= の後ろが文字コード。

文字コード変換のSQL

テーブル名を指定して、ひとつずつ変換する。

でも手入力だと面倒なので、シェルスクリプトでまとめてやりたい。

全データベースの全テーブルをまとめて変換

シェルスクリプトを作成して実行。

run_sql関数は、パスワードを引数として直接指定せずに中間ファイル経由で渡すためのもの。この記述の仕方がbash特有の機能なので、他のシェルでは動かない。

–defaults-fileオプションを最初に指定しないとシェル実行がエラーとなった。理由はわからないけど、他の引数は後ろにつけないとダメみたい。

全データベースのデフォルト文字コードとエンジン名を表示

今回の目的とはちょっと違うけど、全部無条件に変換したら時間がかかりそうな場合、まずどれくらいのテーブルを変換するのか先に確認しておきたいときに使えるスクリプトを作ってみた。