概要
LinuxのMySQLクライアントからMySQLに対して日本語を入力したとき、以下のような状況となった。
- 変換中は表示されるが、確定のためEnterを押すと消えてしまう
- 下記のようにデータベースに登録できない
12root@localhost [test]> INSERT INTO test_table (text) VALUES ('やあ');ERROR 1366 (HY000): Incorrect string value: '\xE6\x97\xA5\xE6\x9C\xAC...' for column 'text' at row 1
これを解決するため、OSのロケール設定とMySQLの文字コード設定を変更する。
OSのロケール設定
locale
コマンドで現在のロケール設定を確認。デフォルトでCロケールが設定されている。
1 2 3 4 5 6 7 8 9 |
$ locale LANG= LC_CTYPE="C" LC_COLLATE="C" LC_TIME="C" LC_NUMERIC="C" LC_MONETARY="C" LC_MESSAGES="C" LC_ALL= |
/etc/profile
に以下の2行を追加して再読み込みor再起動。=
の前後には空白を入れないこと。
1 2 |
export LC_ALL=ja_JP.UTF-8 export LANG=ja_JP.UTF-8 |
設定変更後。
1 2 3 4 5 6 7 8 9 |
$ locale LANG=ja_JP.UTF-8 LC_CTYPE="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_ALL=ja_JP.UTF-8 |
MySQLの文字コード設定
確認方法と指定方法
初期状態のMySQLの文字コードは以下のような状況。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@localhost [(none)]> SHOW VARIABLES LIKE 'character%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec) |
my.cnf
のmysql
セクションとmysqld
セクションにそれぞれ以下を追加。my.cnf
の場所は以下のような方法で特定。
mysql --help | grep my.cnf
find / -name my.sql
1 2 3 4 |
[mysql] default-character-set = utf8 [mysqld] character-set-server = utf8 |
この結果文字コード設定は以下のようになり、日本語の入力が可能になった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
root@localhost [(none)]> SHOW VARIABLES LIKE 'char%'; +--------------------------+----------------------------------+ | 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 | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.01 sec) root@localhost [(none)]> 日本語入力が可能になった; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '日本語入力が可能になった' at line 1 |
コンソールの文字コード
なおこのとき、Windowsホスト上のVagrantをコマンドプロンプトで操作していた。コンソールの文字コードは932(shift_jis)だったが、入力時に文字化けはしなかった。
それでも入力できない
なお、この設定変更をしても、変更前に作成したデータベースに対して入力できない場合がある。
そのようなときは、以下の2つのいずれかの方法をとる。
- 新たな設定の下で、データベースから作りなおす
- データベースとテーブルの設定を個別に変更する