データベース基本概念

コレーション これーしょん

文字コードソート順照合順序MySQLUnicode大文字小文字
コレーションについて教えて

簡単に言うとこんな感じ!

データベースで文字を「どの順番で並べるか」「大文字と小文字を同じとみなすか」みたいなルールのことだよ!辞書にも「あいうえお順」と「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.0utf8mb4utf8mb4_0900_ai_ciutf8mb4_ja_0900_as_cs
PostgreSQLUTF8C または ja_JP.UTF-8ja_JP.UTF-8
SQL ServerLatin1_GeneralLatin1_General_CI_ASJapanese_CI_AS
SQLiteUTF-8バイナリ照合(BINARY)外部ライブラリ対応
Oracle設定によるBINARYJAPANESE_M など

コレーション設定のレベル(MySQLの例)

コレーションはデータベース全体から列(カラム)単位まで、複数のレベルで設定できます。

サーバーレベル my.cnf / サーバー起動時の設定 データベースレベル CREATE DATABASE … COLLATE 〇〇 テーブルレベル CREATE TABLE … COLLATE 〇〇 カラムレベル(最優先) name VARCHAR(100) COLLATE 〇〇 ※ 下位レベルの設定が上位レベルを上書きする(カラムが最優先)

よくある落とし穴:異なるコレーション間の結合

-- ⚠️ エラーまたは意図しない結果になるケース
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の基本設定のひとつ
  • 文字化け — 文字コードやコレーションの不一致によって文字が正しく表示されない現象