コレーション これーしょん
簡単に言うとこんな感じ!
データベースで文字を「どの順番で並べるか」「大文字と小文字を同じとみなすか」みたいなルールのことだよ!辞書にも「あいうえお順」と「ABC順」があるよね?それと同じで、DBにも文字の並べ方・比べ方のルールが必要なんだ。これがコレーション(照合順序)ってこと!
コレーションとは
コレーション(Collation)とは、データベースにおいて文字列をどのように比較・ソート(並び替え)するかを定めたルールのことです。日本語では「照合順序(しょうごうじゅんじょ)」とも呼ばれます。たとえば「A」と「a」を同じ文字として扱うか、「é」と「e」をどの順番に並べるか、といった判断はすべてコレーションによって決まります。
コレーションは文字コード(キャラクターセット)と常にセットで機能します。文字コードが「どの文字を扱えるか」を決めるのに対し、コレーションは「その文字をどう比べるか」を決める役割を担います。たとえばUTF-8という文字コードを使っていても、コレーションの設定によって検索やソートの結果がまったく変わることがあります。
実務では、コレーションの設定ミスが「検索してもヒットしない」「意図しない順番で並んでいる」「大文字・小文字を別物として扱ってしまう」といったバグの原因になることが多く、システム設計の初期段階でしっかり決めておくべき重要な設定のひとつです。
コレーションの仕組みと種類
コレーションには複数の要素が組み合わさっており、名前を見るだけで設定内容がわかるような命名規則になっています(例:MySQLの場合)。
| 要素 | 説明 | 例 |
|---|---|---|
| キャラクターセット | 対象の文字コード | utf8mb4 |
| 言語・ロケール | どの言語ルールを使うか | ja(日本語)/ general |
| 大小文字の区別 | ci = 区別しない / cs = 区別する | ci (Case Insensitive) |
| アクセント記号の区別 | ai = 区別しない / as = 区別する | as (Accent Sensitive) |
よく使われるコレーション名の読み方(MySQL例)
utf8mb4_general_ci
↑ ↑ ↑
文字コード 汎用 大小文字区別しない
utf8mb4_unicode_ci → Unicode標準に基づくソート、大小文字区別しない
utf8mb4_ja_0900_as_cs → 日本語ルール、アクセント区別あり、大小文字区別あり
大文字・小文字の区別(ci vs cs)の影響例
| 検索クエリ | コレーション | ヒットするデータ |
|---|---|---|
WHERE name = 'apple' | ci(区別しない) | apple / Apple / APPLE すべてヒット |
WHERE name = 'apple' | cs(区別する) | apple のみヒット |
歴史と背景
- 1960年代〜 コンピュータが英語圏を中心に普及。ASCIIコード(127文字)だけで十分だったため、ソート順も単純なアルファベット順(バイナリ順)で事足りていた
- 1980年代〜 欧州言語(ドイツ語・フランス語など)の普及に伴い、アクセント記号(é、ü など)の扱いが問題に。各DBベンダーが独自の照合ルールを実装し始める
- 1990年代〜 Unicodeが登場し、世界中の文字を統一的に扱えるようになった。同時に「どう並べるか」のルールを標準化する必要が生じ、Unicode照合アルゴリズム(UCA: Unicode Collation Algorithm) が策定される
- 2000年代〜 MySQL・PostgreSQL・Oracle などの主要DBがUCAに基づくコレーションを採用。日本語・中国語・韓国語など多言語対応が本格化
- 現在 クラウドDB(Amazon Aurora、Google Cloud SQL など)でもコレーションは設定項目として重要視されており、グローバルサービスでは複数言語対応のコレーション選択が必須になっている
主要DBごとのコレーション設定比較
DBMSによってコレーションの設定方法や名称が異なります。発注・選定時に確認しておくべきポイントをまとめます。
| DBMS | デフォルト文字コード | デフォルトコレーション | 日本語対応コレーション例 |
|---|---|---|---|
| MySQL 8.0 | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_ja_0900_as_cs |
| PostgreSQL | UTF8 | C または ja_JP.UTF-8 | ja_JP.UTF-8 |
| SQL Server | Latin1_General | Latin1_General_CI_AS | Japanese_CI_AS |
| SQLite | UTF-8 | バイナリ照合(BINARY) | 外部ライブラリ対応 |
| Oracle | 設定による | BINARY | JAPANESE_M など |
コレーション設定のレベル(MySQLの例)
コレーションはデータベース全体から列(カラム)単位まで、複数のレベルで設定できます。
よくある落とし穴:異なるコレーション間の結合
-- ⚠️ エラーまたは意図しない結果になるケース
SELECT *
FROM table_a -- collation: utf8mb4_general_ci
JOIN table_b -- collation: utf8mb4_unicode_ci
ON table_a.name = table_b.name;
-- → "Illegal mix of collations" エラーが発生することがある
テーブル同士を結合(JOIN)する際、コレーションが異なるとエラーが出たり、インデックスが使われず検索が極端に遅くなることがあります。複数テーブルにまたがるシステムでは、コレーションを統一しておくことが鉄則です。
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| Unicode TR10 (UCA) | Unicode照合アルゴリズム(Unicode Collation Algorithm)の仕様。主要DBのコレーションの基盤となっている |
| ISO/IEC 14651 | 国際文字列照合順序の標準規格。UCAと密接に関連 |
関連用語
- 文字コード — 文字をコンピュータ上でどう表現するかを定めた規則。コレーションと常にセットで考える
- UTF-8 — 世界中の文字を表現できる文字コード。Webやデータベースで最も広く使われる
- Unicode — 世界中の文字に一意の番号を割り当てた国際標準。コレーションのベースとなる
- インデックス — データベースの検索を高速化する仕組み。コレーションが異なるとインデックスが効かない場合がある
- MySQL — 世界で広く使われるオープンソースのRDBMS。コレーション設定が細かく制御できる
- PostgreSQL — 高機能なオープンソースRDBMS。ロケールベースのコレーションを採用
- RDBMS — リレーショナルデータベース管理システム。コレーションはRDBMSの基本設定のひとつ
- 文字化け — 文字コードやコレーションの不一致によって文字が正しく表示されない現象