ySQLの文字コードはデフォルトの設定はlatin1になっている。このlatin1に日本語は入らない。ところが、データベースをlatin1でつくり、クライアントの文字コードもlatin1にすると、ほとんどの場合、正常に表示されてしまう。一見何も問題ないかのように見える。しかしlatin1の設定では、蚊と隊、渦と並、靴と蝴、人と溺、騎と討の区別ができない。
現在使っている文字コードが何かを知るには、MySQLコマンド画面で、
show variables like 'character_set%'; と入力する。variablesはMySQLシステム変数を示し、likeは「〜のようなもの」という意味で、%はワイルドカード文字と言われ、任意の文字を示す。つまりこのコマンドは「character_setから始まるMySQLシステム変数を示して下さい。」という意味である。デフォルトの設定なら、
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
と表示される。
この状態で、次のコマンドを実行し、データベースKokoromiとテーブルShikenをつくる。なおMySQLコマンドは大文字、小文字を区別しない。下記のコードでは、大文字で書いたり、小文字で書いたりしている。
CREATE DATABASE Kokoromi;
use Kokoromi;
CREATE TABLE Shiken(
kanji VARCHAR(20),
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
テーブルShikenにデータを挿入する。
INSERT INTO Shiken(kanji) VALUES("蚊");
INSERT INTO Shiken(kanji) VALUES("隊");
INSERT INTO Shiken(kanji) VALUES("渦");
INSERT INTO Shiken(kanji) VALUES("並");
INSERT INTO Shiken(kanji) VALUES("靴");
INSERT INTO Shiken(kanji) VALUES("蝴");
INSERT INTO Shiken(kanji) VALUES("人");
INSERT INTO Shiken(kanji) VALUES("溺");
INSERT INTO Shiken(kanji) VALUES("騎");
INSERT INTO Shiken(kanji) VALUES("討");
SELECT * FROM Shiken WHERE kanji="蚊"; とすると、蚊と隊の二つを選択してしまう。
SELECT * FROM Shiken WHERE kanji="隊"; としても、蚊と隊の二つを選択する。
SELECT * FROM Shiken WHERE kanji="渦"; とすると、渦と並の二つを選択してしまう。
SELECT * FROM Shiken WHERE kanji="並"; としても、渦と並の二つを選択する。
SELECT * FROM Shiken WHERE kanji="靴"; とすると、靴と蝴の二つを選択してしまう。
SELECT * FROM Shiken WHERE kanji="蝴"; としても、靴と蝴の二つを選択する。
SELECT * FROM Shiken WHERE kanji="人"; とすると、人と溺の二つを選択してしまう。
SELECT * FROM Shiken WHERE kanji="溺"; としても、人と溺の二つを選択する。
SELECT * FROM Shiken WHERE kanji="騎"; とすると、騎と討の二つを選択してしまう。
SELECT * FROM Shiken WHERE kanji="討"; としても、騎と討の二つを選択する。
蚊と隊、渦と並、靴と蝴、人と溺、騎と討 の区別ができないのである。
こういうことが起こらないようにするためには、文字コードの設定をutf8に変更しておく必要がある。
文字コードの設定はmy.cnfでする。ubuntuなら、/etc/mysql/my.cnfにある。
my.cnfの
[client]
の項目の所に
default-character-set=utf8
を書き加え、
[mysqld]
の項目の所に
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
を書き加える。
再起動して、MySQLコマンド画面にshow variables like 'character_set%'; と入力すると、
+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------
と表示される。character_setがutf8に変わっている。
drop database Kokoromi;
でデータベースKokoromiを削除した後、上のコマンドでまたデータベースKokoromiとテーブルShikenをつくり、データを挿入する。select文を実行してみると、蚊と隊、渦と並、靴と蝴、人と溺、騎と討 が区別され、ひとつしか選択しない。
文字コードの変更をしなくても、ほとんどの場合正常に動いてしまうため、文字コードの変更を忘れていることに気づきにくい。注意する必要がある。