今回は、SQL Serverの照合順序について調べていた時に、初めて知ったことについて忘れないように記事にしたいと思います。
照合順序については、大文字小文字の区別やソート順の規則などを決定することは、以前から知っていたのですが「表示可能な文字を規定する」という役割は知りませんでした。
以下ではその挙動を実際に確認したいと思います。
現在設定されている照合順序を確認する
まずは、現在設定されている照合順序を確認しておきます。
SSMSでオブジェクトエクスプローラーからサーバーを選択し、右クリックしてからプロパティを開き、全般セクションに「サーバーの照合順序」を確認できます。

上記の通り、私の環境では照合順序は「Japanese_CI_AS」が設定されていることがわかります。日本語環境でSQL Server をインストールした際は、デフォルトの照合順序は「Japanese_CI_AS」のようです。
照合順序と文字列型の文字コードについて
照合順序は、charやvarcharなどの非Unicode文字列型で使用する文字コード(コードページ)を決定するようです。その文字コード(コードページ)が使用されて、文字列がデータベースに格納されます。
サーバーに設定されている照合順序の文字コード(コードページ)の確認は以下のクエリでできます。
SELECT name, COLLATIONPROPERTY(name, 'CodePage') AS code_page FROM sys.fn_helpcollations() WHERE name = SERVERPROPERTY('COLLATION')
私の環境で上記クエリを実行した結果は以下の通りです。照合順序「Japanese_CI_AS」は、コードページ 932 (CP932 : Shift-JIS) を使用することになります。

照合順序が「表示可能な文字を規定する」について確認する
冒頭で照合順序が「表示可能な文字を規定する」ことについて言及しました。実際にその挙動を確認してみたいと思います。
今回は、以下のようなvarchar文字列型のカラムを1つ持つテーブルを作成し、コードページ932で表現できない文字列を、テーブルに格納した場合はどうなるのか確認したいと思います。今回は、代表として絵文字「😇」(U+1F607)を登録してみたいと思います。
CREATE TABLE [dbo].[Table_1]( [str] [varchar](50) NULL ) INSERT INTO [dbo].[Table_1] VALUES ('😇');
上記クエリを実行した後に、検索した結果は以下の通りです。「??」が表示されてしまっています。このように、照合順序で規定されているコードページ(今回は、CP932)で表現できない文字列の場合は「?」が表示されてしまいます。

おわりに
いかがでしたでしょうか。照合順序の設定によって、表現可能な文字列が規定されていることを知らなかったので、とても勉強になりました。
データベースを使用するアプリケーションでどのような文字列を表示するかをあらかじめ把握しておかないと、今回のように入力した文字列を表示できないような事態になるので、照合順序は改めてしっかりと理解しておかないといけないなと感じました。
因みに、Unicode文字列型である、ncharやnvarcharなどについては言及していませんでしたが、それらの文字列型を使用した場合は、今回の照合順序の規則は関係ないようです。
今回はこの辺で。最後までお読みいただきありがとうございました。