前回は,マルチバイト文字コードを使用しているユーザであれば陥りがちな「文字化け」をテーマに解説を行った。特に日本では,複数の文字コードが存在するので,混乱を助長してしまう。

 さて,文字コードの違いによる弊害は,文字化けという表示の問題だけではない。データベースは,データの蓄積と提供が重要な役割である。大量のデータを提供する際には,並べ替えが必要になる。実は,文字データの場合,文字コードによって,並びが変化することをご存知だろうか。今回は,ソート処理と文字列の関係を解説する。

ソート処理での文字コードの影響

 文字には,大文字と小文字のように同じ文字ながら,単語や文書での位置によって体裁が変わる場合がある。また,海外では,地域によって,アルファベットの並びが異なったり,文字自体が異なったりする言語もある。例えば,キートップの刻印が,国や地域によって異なるのはご存知だろうか。

 そのため,文字コード以外に,文字コード毎に文字の順番を規定するためのデータベースが用意されている。それが,キャラクタセットの照合順序であり,MySQLではcollationとして,システムに格納されている。図1のように show collation; を実行すると,格納されているcollationが参照できる。

図1●collationの一覧(MySQL5.0.24)

mysql> show collation;
+----------------------+----------+-----+---------+----------+---------+
| Collation            | Charset  | Id  | Default | Compiled | Sortlen |
+----------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci      | big5     |   1 | Yes     | Yes      |       1 |
| big5_bin             | big5     |  84 |         | Yes      |       1 |
:
| latin1_german1_ci | latin1 | 5 | | Yes | 1 | | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 | | latin1_danish_ci | latin1 | 15 | | Yes | 1 | | latin1_german2_ci | latin1 | 31 | | Yes | 2 | | latin1_bin | latin1 | 47 | | Yes | 1 | | latin1_general_ci | latin1 | 48 | | Yes | 1 | | latin1_general_cs | latin1 | 49 | | Yes | 1 | | latin1_spanish_ci | latin1 | 94 | | Yes | 1 |
:
| ascii_general_ci | ascii | 11 | Yes | | 0 | | ascii_bin | ascii | 65 | | | 0 | | ujis_japanese_ci | ujis | 12 | Yes | Yes | 1 | | ujis_bin | ujis | 91 | | Yes | 1 | | sjis_japanese_ci | sjis | 13 | Yes | Yes | 1 | | sjis_bin | sjis | 88 | | Yes | 1 |
:
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | | utf8_icelandic_ci | utf8 | 193 | | Yes | 8 | | utf8_latvian_ci | utf8 | 194 | | Yes | 8 | | utf8_romanian_ci | utf8 | 195 | | Yes | 8 | | utf8_slovenian_ci | utf8 | 196 | | Yes | 8 | | utf8_polish_ci | utf8 | 197 | | Yes | 8 | | utf8_estonian_ci | utf8 | 198 | | Yes | 8 | | utf8_spanish_ci | utf8 | 199 | | Yes | 8 | | utf8_swedish_ci | utf8 | 200 | | Yes | 8 | | utf8_turkish_ci | utf8 | 201 | | Yes | 8 | | utf8_czech_ci | utf8 | 202 | | Yes | 8 | | utf8_danish_ci | utf8 | 203 | | Yes | 8 | | utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 | | utf8_slovak_ci | utf8 | 205 | | Yes | 8 | | utf8_spanish2_ci | utf8 | 206 | | Yes | 8 | | utf8_roman_ci | utf8 | 207 | | Yes | 8 | | utf8_persian_ci | utf8 | 208 | | Yes | 8 | | utf8_esperanto_ci | utf8 | 209 | | Yes | 8 | | utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
:
| binary | binary | 63 | Yes | Yes | 1 | | geostd8_general_ci | geostd8 | 92 | Yes | | 0 | | geostd8_bin | geostd8 | 93 | | | 0 | | cp932_japanese_ci | cp932 | 95 | Yes | Yes | 1 | | cp932_bin | cp932 | 96 | | Yes | 1 | | eucjpms_japanese_ci | eucjpms | 97 | Yes | Yes | 1 | | eucjpms_bin | eucjpms | 98 | | Yes | 1 | +----------------------+----------+-----+---------+----------+---------+ 126 rows in set (0.00 sec)

 MySQL5.0では,126種類のCollationが用意されている。一つの文字コードに複数のCollationが用意されているのが分かる。例えば,MySQLのデフォルト文字コードであるlatin1は,8種類も用意されている。Collationの命名規則は,"文字コード_言語名_比較法"となっている。比較方法は,表1のような意味を持つ。

表1●Collationの比較法

ci 大文字小文字を区別しない
cs 大文字小文字を区別する
bin バイナリコードで比較する

 例えば,ujis文字コードは,ujis_japanese_ciとujis_binの2種類のCollationが用意されている。これは,日本語用の大文字小文字を区別するものとバイナリコードで区別するものというのが分かる。日本語用の文字コードは,日本語専用なので,海外の文字コードのように,言語による照合順序の違いはないので,どれも2種類だけだ。但し,UTF8は,各国語共通なので,21種類ものCollationがある。