WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

MySQLでの文字セット・照合順序の設定

      2015/07/23

文字セットと照合順序について

MySQLでは扱うデータに対して文字セットと照合順序を設定することができます。

※ここでいう「文字セット」とは、コード化文字集合と文字エンコーディング方式の組み合わせという意味にします。
  個人的に文字集合・文字セット・文字コードなどの違いをよく理解できていなかったのですが、その辺の区別は下記のページが詳しいです。

いいから聞け! 俺が文字コードについて教えてやるよ その1(前提知識編) – 谷本 心 in せろ部屋

照合順序とは複数の値を比較する時に、どのように比較するのかを定義しているものです。
照合順序によって半角・全角、小文字・大文字の扱いが異なります。例えば、大文字小文字の区別して検索するかなどです。

使用可能な文字セットの確認

下記SQLで使用可能な文字セットの一覧を表示できます。

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
〜(略)〜
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
〜(略)〜
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
〜(略)〜
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
39 rows in set (0.05 sec)

※長いのでよく使いそうなやつ以外は省きました

下記にそれぞれのカラムの概要を記載していきます。

Charset

文字セットの名前です。
後述しますが、文字セットを指定するときはこのカラムの値である”utf8″や”sjis”を指定します。

Description

文字セットの概要です。

Default collation

文字セットで使用されるデフォルトの照合順序です。

文字セット毎に用意されている照合順序は異なりますが以下のような共通点があります。

  • 末尾が「_ci」となっているものは大文字と小文字を区別しない
  • 末尾が「_cs」となっているものは大文字と小文字を区別する
  • 末尾が「_bin」となっているものはバイナリ比較を行う

※ciは”Case Insensitive”の略称のようです

例えば、照合順序が”utf8_general_ci”なら大文字と小文字を区別しません。
さらに”utf8_unicode_ci”という半角と全角を区別しない照合順序も存在します。

よく利用するutf8での照合順序の挙動に関しては下記が詳しいです。

MySQLの照合順序 – Qiita

Maxlen

「Maxlen」カラムの値は、その文字セットで1つの文字に必要となる最大バイト数を意味しています。

文字セットの設定

MySQLではサーバ、データベース、テーブル、カラムのそれぞれに文字セットと照合順序を設定することができます。

設定のタイミングとしては生成時にCREATE文で設定することができます。
下記はテーブル生成時に設定する例です。

mysql> create table `users`
( `id` int(11) NOT NULL auto_increment,
  `name` varchar(255),
  primary key (`id`)
) engine=InnoDB default character set utf8 collate utf8_bin;

後からALTER文で変更することも可能です。

mysql> ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

いずれにしても、”SET 文字セット名 COLLATE 照合順序名“という書式になっていることがわかります。

参考資料

 - MySQL , , , ,