SQL Azure のバージョンアップにより、ユーザーデータベース作成時に任意の照合順序が指定できるようになりました。
CREATE DATABASE (SQL Azure Database)
オンプレミスの SQL Server の場合はユーザーデータベースであれば、ALTER DATABASE で COLLATE 句を使用することで作成後も変更することが可能です。
データベース照合順序の設定および変更
SQL Azure の場合は ALTER DATABASE の COLLATE 句はサポートされていないため、照合順序の設定ができるのはデータベースの作成時のみとなるようです。
ALTER DATABASE (SQL Azure Database)
SQL Azure のデータベースの照合順序ですが、一時テーブルにも影響を与えそうです。
今回はこの点についてまとめてみたいと思います。
■データベースの照合順序と一時テーブルの照合順序
現在は、Azure のポータルから DB を新規に作成する場合には照合順序を選択することはできないようです。
SQL Azure のポータルから DB を新規に作成する際には、照合順序が選択できます。
デフォルトでは、[SQL_Latin1_General_CP1_CI_AS] が設定されている状態となっています。
今回は、[Japanese_XJIS_BIN2] に設定してみます。
作成が終わったら、作成した DB に接続して、[sys.databases] から照合順序を確認してみます。
master はデフォルトの [SQL_Latin1_General_CP1_CI_AS] が照合順序として設定されていますが、作成したユーザーデータベースは設定したものになっているのが確認できますね。
この照合順序ですが、一時テーブルに関しても影響するようです。
通常、一時テーブルは tempdb 上に作成され、照合順序も tempdb のものが使用されます。
- tempdb の照合順序が [Japanese_XJIS_100_CI_AS_SC] (大文字小文字を区別しない / アクセントを区別する / 補助文字)
- ユーザーデータベースの照合順序が [Japanese_XJIS_BIN2]
となっている環境で以下のクエリを実行してみます。
CREATE TABLE #tmp(Col1 nvarchar(1)) |
ユーザーデータベース自体はバイナリ照合順序のため、大文字 / 小文字が区別されますが、tempdb は大文字 / 小文字を区別しない照合順序となっているため、小文字の [a] で挿入したデータを 大文字の [A] で検索しても条件にヒットする形となります。
# tempdb の照合順序が使用されているため。
それでは、SQL Azure に対して同じクエリを実行してみます。
システムデータベースである master は [SQL_Latin1_General_CP1_CI_AS] (大文字小文字を区別しない / アクセントを区別する) となっているため、一時テーブルでもこの照合順序が使用されると思ったのですがそうではなくユーザーデータベースの照合順序が一時テーブルでも使われるようです。
SQL Server 2012 でもコンテインメント (Contained Databases : 包含データベース) を使用することで、一時テーブルの照合順序をユーザーデータベースのものを使用するということが可能なのですが、これと同等の実装となっているようですね。
# SQL Server 2012 の包含データベースは SQL Azure からのフィードバックかな~と個人的に思ったりしています。
SQL Server 2012 で包含データベースを使って開発していれば、この辺は意識しなくても大丈夫かもしれませんが、SQL Server 2008 R2 では包含データベースの機能はありませんので、tempdb の照合順序はインストール時に指定したものが使用されることになりますので、一時テーブルを使用した開発をする際には少し注意する必要がありそうですね。