mysql.exeでUTF-8を使う

拙著『Webアプリケーション』では、Windowsのコマンドプロンプトでmysql.exeを対話的に使うときは、「mysql -uユーザ名 -pパスワード --default-character-set=cp932」のようにして、文字コードをcp932にすることを推奨しています。理由は2つあります。

  1. コマンドプロンプトでUTF-8を利用するのが面倒(特にWindows XPで)
  2. MySQL 5.5以前のmysql.exeにはUTF-8に関するバグがある

第1の問題は完全には解決されていません。日本語環境のコマンドプロンプトのデフォルトの文字コードはcp932ですが、プロパティでフォントをMS ゴシックに変更してから「chcp 65001」とすると、UTF-8で日本語を利用できます(変更してからプロパティを開いてはいけません)。面倒です。Windows XPではさらに作業が必要だったのですが、XP自体がそろそろ終わりなのでまあいいでしょう。(MS ゴシック以外のフォントを使いたい場合は先に一手間必要です。「コマンドプロンプト フォント 変更」などで探してください。)

第2の問題はMySQL 5.6で解決されました(XAMPPなら1.8.3以降)。

というわけで、前準備(フォントの変更)がバッドノウハウではありますが、p.100の脚註11とp.188の「WindowsのコマンドプロンプトではCP932(Windows-31J)しか使えない」という記述は昔話になりました。

コマンドプロンプトでUTF-8を使っている様子を以下に掲載します(設定ファイルはデフォルトのまま、「--default-character-set=utf8」や「SET NAMES utf8;」は無くても大丈夫です)。

C:\>chcp 65001
Active code page: 65001

C:\>mysql -uroot test
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 77
Server version: 5.6.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+--------------------------------+
| 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     | latin1                         |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

mysql> CREATE TABLE t (name TEXT) CHARSET=utf8;
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT t(name) VALUES ('안녕하세요');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM t;
+-----------------+
| name            |
+-----------------+
| 안녕하세요      |
+-----------------+
1 row in set (0.00 sec)

きれいに表示されないという問題が残っていますね。