Skip to content

MS_SQLServerCollation

nishi_74322014 edited this page Aug 13, 2026 · 1 revision

SQL Server の照合順序

概要

日本語照合順序の違い

ソート順、文字の大小関係の定義が違う。

  • Japanese
  • Japanese_XJIS
  • Japanese_Bushu_Kakusu
  • Japanese_Unicode

照合順序バージョン

カバーしている文字が違う。

照合順序バージョン SQL Server バージョン Unicode バージョン
記載なし SQL Server 2000 Unicode 2.0
90 SQL Server 2005 Unicode 3.2
100 SQL Server 2008 Unicode 5.0

補足(最新化:140 系と UTF-8): 上表以降、以下が追加されている。

照合順序バージョン SQL Server バージョン 備考
140 SQL Server 2017 日本語では Japanese_XJIS_140 など
(UTF-8) SQL Server 2019 _UTF8 サフィックス付きの照合順序

SQL Server 2019 の UTF-8 照合順序(例: Japanese_XJIS_140_CI_AS_UTF8)は、
char / varchar の格納エンコーディングを UTF-8 にするもの。
ASCII 主体のデータではストレージを削減できるが、
日本語は 3 バイトになるため逆に増えることが多い。
日本語システムでは引き続き nvarchar(UTF-16)が基本と考えてよい。

辞書順オプション

CS

C : 大文字小文字(Case) を区別するかどうか。

  • S (Sensitive) は区別する。
  • I (Insensitive) は区別しない。

AS

A : 濁点や半濁点(Accent) などの有無を区別するかどうか。

  • S (Sensitive) は区別する。
  • I (Insensitive) は区別しない。

KS

K : 平仮名カタカナ(Kana) を区別するかどうか。

  • S (Sensitive) は区別する。
  • I (Insensitive) は区別しない。

移行メモ(補足): KS / WS は、
付いていれば Sensitive(区別する)、無ければ Insensitive という指定方法で、
KI / WI という書き方はしない。
CS / CIAS / AI とは記法が異なる点に注意。

WS

W : 全角半角(Width) を区別するかどうか。

  • S (Sensitive) は区別する。
  • I (Insensitive) は区別しない。

SC

SQL Server 2012 以降で、補助文字(Supplementary Character) を認識するかどうか。
補助文字を認識し、文字列の文字数を返す LEN 関数などの動作に影響する。

移行メモ(誤字): 元ページの「助文字を認識し」は「助文字を認識し」の誤記。

補足(SC が要る場面): 補助文字(サロゲート ペア)は、
絵文字や一部の漢字(𠮟、𩸽 など JIS 第 3・第 4 水準の一部)が該当する。
SC が無い照合順序では、これらが
2 文字としてカウントされ、SUBSTRING で分断されうる
人名や住所を扱う業務システムでは SC 付きを選ぶのが無難。

バイナリ順オプション

  • BIN
  • BIN2

補足(BINBIN2: BIN は最初の 1 文字のみ Unicode コード ポイントで
比較し、2 文字目以降はバイト単位で比較する旧方式。
BIN2 は全文字を純粋にコード ポイント順で比較する。
バイナリ照合順序を使うなら BIN2 を選ぶ

ポイント

  • Japanese_Unicode* については、
    SQL Server 7.0 時代の古いものなので選択しないでください。

  • 基本的には最新のものを使うのが良いですので、
    Japanese_XJIS_100* を使うのが良いという事になります。

  • 既定の照合順序は下記を参照。

  • 照合順序を細かい要件に合わせる必要がある場合、上記の仕様や
    下記 URL の「文字一覧の作成スクリプトサンプル」を使用して確認下さい。

移行メモ(誤字): 元ページの「細い要件」は「細い要件」の誤記。

補足(照合順序の不一致が引き起こす障害): 照合順序は
サーバ/データベース/列/式の 4 階層で指定でき、
異なるものが混在すると実行時エラーになる。

'Japanese_XJIS_100_CI_AS' と 'Japanese_CI_AS' 間の照合順序の競合を
equal to 操作で解決できません。

特に起きやすいのが、

  • 本番とは違う照合順序で作った検証環境からの移行
  • tempdb(サーバ照合順序)と一時テーブルの結合
    (一時テーブルは tempdb の照合順序で作られるため、
    ユーザ DB の照合順序と異なると JOIN で競合する)

後者は、一時テーブルの列定義に
COLLATE DATABASE_DEFAULT を付けることで回避できる。

CREATE TABLE #tmp (
    Code nvarchar(10) COLLATE DATABASE_DEFAULT NOT NULL
);

補足(CI と索引の利用): WHERE UPPER(col) = 'ABC' のように
列に関数を適用すると SARGable でなくなりインデックスが使われない
CI(大文字小文字を区別しない)照合順序であれば、
そもそも WHERE col = 'abc' で大文字小文字を無視した比較になるため、
関数を掛ける必要がない。
詳細はSQL Server のインデックスを参照。

参考

余談

テーブル名とカラム名の大文字・小文字

下記で設定可能。

補足: 識別子(テーブル名・列名)の大文字小文字の区別は
データベースの照合順序に従う。
CS(Case Sensitive)の DB では CREATE TABLE Usersselect * from users
別物として扱われエラーになるため、
アプリのソースコードとの整合に注意が必要である。


Tags: 移行, データアクセス, SQL Server

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally