概要
MySQLで日本語入力対策でロケールや文字コードを設定変更しても、なお日本語入力でエラーが出ることがある。
これは、設定変更前にデータベースやテーブルを作成し、後から設定を変更してもcharacter_set_database
がlatin1
のような状態で残ってしまうため。
また、他の環境で作成したデータベースをCSVで取り込もうとしたとき、文字コードを合わせたのにcollation(照合順序)が違うと怒られてインポートできないという場合がある。
ここでは、既作成のデータベースやテーブルの文字コード、照合順序を変更する手順をまとめる。
現象
文字コードを変更したのに入力できない
ロケールも変更して
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の文字コードも変更して
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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) |
再起動もしたのに、日本語が入力できてもデータベースに登録できない。
1 2 |
root@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 |
確認
character_set
MySQLの文字コードを確認するのにUSE
でデータベースを指定する前に確認したが、データベース指定後に確認した結果が以下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@localhost [test]> 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 | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.01 sec) |
既作成のデータベースでは、作成時の文字コード設定が残っている。
データベースの文字コード
既作成データベースの文字コード確認。文字コードがlatin1
になっている。
1 2 3 4 5 6 7 |
root@localhost [test]> SHOW CREATE DATABASE test; +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec) |
テーブルの文字コード
既作成テーブルの文字コード確認。こちらも文字コードがlatin1
になっている。
1 2 3 4 5 6 7 8 9 |
root@localhost [test]> SHOW CREATE TABLE test_table; +------------+------------------------------------------------------------------------------------------------------+ | Table | Create Table | +------------+------------------------------------------------------------------------------------------------------+ | test_table | CREATE TABLE `test_table` ( `text` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +------------+------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) |
対応
データベースを作りなおす
文字コードがlatin1
でまだデータ未入力の段階で発覚したようなときは、一旦drop
でデータベースを消して新たに作りなおせば、全体の文字コードに従ったデータベース、テーブルが作成される。
設定を変更する
既にデータが入力されているときに設定を変更したいときは、データベース、テーブルの別に文字コードを変更する。
データベースの文字コードセットを変更する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
root@localhost [test]> ALTER DATABASE test CHARACTER SET utf8; Query OK, 1 row affected (0.00 sec) root@localhost [test]> 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.00 sec) root@localhost [test]> SHOW CREATE DATABASE test\G *************************** 1. row *************************** Database: test Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ 1 row in set (0.00 sec) |
テーブルの文字コードセットを変更する。
1 2 3 4 5 6 7 8 9 |
root@localhost [test]> ALTER TABLE test_table CONVERT TO CHARACTER SET utf8 root@localhost [test]> SHOW CREATE TABLE test_table\G *************************** 1. row *************************** Table: test_table Create Table: CREATE TABLE `test_table` ( `text` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) |
これでやっと日本語の入力のエラーがなくなった。
1 2 |
root@localhost [test]> INSERT INTO test_table (text) VALUES ('やあ'); Query OK, 1 row affected (0.01 sec) |