-
Notifications
You must be signed in to change notification settings - Fork 0
MS_SQLServerCollation
- 戻る(SQL Server の基本的な設定)
- SQL Server の照合順序
- SQL Server の認証 / SQL Server の障害復旧 / SQL Server での設定取得方法
- つながらない!- SQL Server(つながらない!)
-
照合順序 - 文字の比較と並び順(その 1)
Microsoft SQL Server Japan Support Team Blog
https://learn.microsoft.com/ja-jp/archive/blogs/jpsql/日本語照合順序のひとつである
Japanese_90_CS_AS_KS_WS_SCを例に見てみましょう。
Japanese_90_CS_AS_KS_WS_SCは、_で区切られる部分ごとに以下の意味があります。 -
照合順序の使用
https://learn.microsoft.com/ja-jp/sql/relational-databases/collations/collation-and-unicode-support- 照合順序の設定と変更
https://learn.microsoft.com/ja-jp/sql/relational-databases/collations/set-or-change-the-server-collation- サーバー照合順序の設定と変更
- データベース照合順序の設定および変更
- 列の照合順序の設定と変更
- 式の照合順序の設定
- 識別子の照合順序
- 照合順序の設定と変更
ソート順、文字の大小関係の定義が違う。
- 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)が基本と考えてよい。
C : 大文字小文字(Case) を区別するかどうか。
- S (Sensitive) は区別する。
- I (Insensitive) は区別しない。
A : 濁点や半濁点(Accent) などの有無を区別するかどうか。
- S (Sensitive) は区別する。
- I (Insensitive) は区別しない。
K : 平仮名カタカナ(Kana) を区別するかどうか。
- S (Sensitive) は区別する。
- I (Insensitive) は区別しない。
移行メモ(補足):
KS/WSは、
付いていれば Sensitive(区別する)、無ければ Insensitive という指定方法で、
KI/WIという書き方はしない。
CS/CI、AS/AIとは記法が異なる点に注意。
W : 全角半角(Width) を区別するかどうか。
- S (Sensitive) は区別する。
- I (Insensitive) は区別しない。
SQL Server 2012 以降で、補助文字(Supplementary Character) を認識するかどうか。
補助文字を認識し、文字列の文字数を返す LEN 関数などの動作に影響する。
移行メモ(誤字): 元ページの「助文字を認識し」は「補助文字を認識し」の誤記。
補足(
SCが要る場面): 補助文字(サロゲート ペア)は、
絵文字や一部の漢字(𠮟、𩸽 など JIS 第 3・第 4 水準の一部)が該当する。
SCが無い照合順序では、これらが
2 文字としてカウントされ、SUBSTRINGで分断されうる。
人名や住所を扱う業務システムではSC付きを選ぶのが無難。
- BIN
- BIN2
補足(
BINとBIN2):BINは最初の 1 文字のみ Unicode コード ポイントで
比較し、2 文字目以降はバイト単位で比較する旧方式。
BIN2は全文字を純粋にコード ポイント順で比較する。
バイナリ照合順序を使うならBIN2を選ぶ。
-
Japanese_Unicode*については、
SQL Server 7.0 時代の古いものなので選択しないでください。 -
基本的には最新のものを使うのが良いですので、
Japanese_XJIS_100*を使うのが良いという事になります。 -
既定の照合順序は下記を参照。
-
照合順序を細かい要件に合わせる必要がある場合、上記の仕様や
下記 URL の「文字一覧の作成スクリプトサンプル」を使用して確認下さい。- 照合順序 - 文字の比較と並び順(その 2)
Microsoft SQL Server Japan Support Team Blog
https://learn.microsoft.com/ja-jp/archive/blogs/jpsql/
- 照合順序 - 文字の比較と並び順(その 2)
移行メモ(誤字): 元ページの「細い要件」は「細かい要件」の誤記。
補足(照合順序の不一致が引き起こす障害): 照合順序は
サーバ/データベース/列/式の 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 のインデックスを参照。
-
照合順序 - 文字の比較と並び順
Microsoft SQL Server Japan Support Team Blog
https://learn.microsoft.com/ja-jp/archive/blogs/jpsql/ -
日本語照合順序 Japanese と Japanese_XJIS_100、Japanese_Bushu_Kakusu_100 の比較
SQL Server 開発チーム ブログ
https://learn.microsoft.com/ja-jp/archive/blogs/sqljapan/ -
照合順序と Unicode のサポート | Microsoft Learn
https://learn.microsoft.com/ja-jp/sql/relational-databases/collations/collation-and-unicode-support
下記で設定可能。
-
COLLATE (Transact-SQL)
https://learn.microsoft.com/ja-jp/sql/t-sql/statements/collations -
CREATE TABLE (Transact-SQL)
https://learn.microsoft.com/ja-jp/sql/t-sql/statements/create-table-transact-sql -
SQL Server データベースに対して
データベース デザイナを使用するときの注意事項(大文字と小文字の区別)
https://learn.microsoft.com/ja-jp/sql/ssms/visual-db-tools/design-database-diagrams-visual-database-tools
補足: 識別子(テーブル名・列名)の大文字小文字の区別は
データベースの照合順序に従う。
CS(Case Sensitive)の DB ではCREATE TABLE Usersとselect * from usersが
別物として扱われエラーになるため、
アプリのソースコードとの整合に注意が必要である。
Tags: 移行, データアクセス, SQL Server
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。