前回は,マルチバイト文字コードを使用しているユーザであれば陥りがちな「文字化け」をテーマに解説を行った。特に日本では,複数の文字コードが存在するので,混乱を助長してしまう。
さて,文字コードの違いによる弊害は,文字化けという表示の問題だけではない。データベースは,データの蓄積と提供が重要な役割である。大量のデータを提供する際には,並べ替えが必要になる。実は,文字データの場合,文字コードによって,並びが変化することをご存知だろうか。今回は,ソート処理と文字列の関係を解説する。
ソート処理での文字コードの影響
文字には,大文字と小文字のように同じ文字ながら,単語や文書での位置によって体裁が変わる場合がある。また,海外では,地域によって,アルファベットの並びが異なったり,文字自体が異なったりする言語もある。例えば,キートップの刻印が,国や地域によって異なるのはご存知だろうか。
そのため,文字コード以外に,文字コード毎に文字の順番を規定するためのデータベースが用意されている。それが,キャラクタセットの照合順序であり,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 | |
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がある。