SQL Server / SQL Database を使用しており設定を初期状態で使用していると、インスタンス / データベースの照合順序は、
- Japanese_CI_AS : 日本語環境のデフォルト
- SQL_Latin1_General_CP1_CI_AS : 英語環境のデフォルト
のいずれかを使用しているケースが多いのではないでしょうか?
これらの照合順序は列レベルの照合順序の初期設定として、引き継がれますので列の比較をする際の挙動にも影響をしてきます。
照合順序については、次のドキュメントの内容を確認することになります。
- 改行されていないスクリプトを確認したい場合はこちら
SQL Server では Unicode の文字の比較を考慮する際には、照合順序の次のような内容を意識する必要があるのではないでしょうか。
- サポートされる Unicode のバージョン
- Unicode コードポイント
- 比較時の重み
SQL Server では、nchar / nvarchar / char (UTF-8 サポートあり) / varchar (UTF-8 サポート) を使用することで、Unicode の文字列を格納することができ、どの照合順序を使用していてもこれらのデータ型を使用している場合は、次のようなエンコードで文字を格納することができます。
- nchar / nvarchar : UCS-2 / UTF-16
- char (UTF-8 サポートあり) / varchar (UTF-8 サポートあり) : UTF-8
ただし、格納と文字の比較は別であり、照合順序の設定によって「格納はできても想定した比較結果にならない」ということがあります。
日本語圏で考えた場合、
- 新しい Unicode のバージョンで追加された文字
- サロゲートペア
- 異体字
というような設定が関係し、「新しい Unicode のバージョンで追加された文字」については、「基本多言語面 (BMP)」である「000000 – 00FFFF」に追加されることもありますので、BMP の範囲の文字についても、照合順序の設定によっては正しく比較されないことがあります。
Unicode の情報については、https://home.unicode.org/ から確認することができ、Unicode のバージョンや、文字のコードポイントを確認する場合には、次の情報を使用するとよいのではないでしょうか。
- Unicode® Code Charts Help and Links
- Unicode Character Code Charts
- https://www.fileformat.info/info/unicode/char/search.htm
SQL Server は文字の格納については、Unicode をサポートしたデータ型を使用していれば、柔軟にデータを登録することができますが、データの比較 については、照合順序の設定が大きく影響してきます。
本投稿では、以前のバージョンの照合順序となる BIN / Unicode は使用しない前提で記載していますので、バイナリ照合順序といえば BIN2 となり、Unicode サポートの照合順序といえば、照合順序名に Unicode がついていないものを前提としています。