SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Database Managed Instance の初期の照合順序について

leave a comment

本投稿は 2018/4 時点の Public Preview の内容です。
一般提供開始時には変更されている可能性があります。

SQL Database Managed Instance (MI) の作成時の UI は下の画像のようにシンプルな構成となっています。
image
SQL Database を使用されている方だと、ピンとくるかもしれませんが、「照合順序」の設定が存在していません。
本投稿では、MI の照合順序について触れてみたいと思います。

SQL Server の T-SQL との相違点 に次の記載があります。

Collation

サーバーの照合順序は SQL_Latin1_General_CP1_CI_AS であり、変更することはできません。 「照合順序」をご覧ください。

MI の既定の照合順序は「SQL_Latin1_General_CP1_CI_AS」に固定されており、変更することはできません。
照合順序を調べたことのある方ですとピンとくるかもしれませんが、次のようなクエリを「master」データベースで実行してみます。

DROP TABLE IF EXISTS #T1
CREATE TABLE #T1 (C1 varchar(50))
INSERT INTO #T1 VALUES('あいうえお')
SELECT * FROM #T1

実際の実行結果がこちらになります。
image
SELECT の結果が「?」になっていますね。

SQL_Latin1_General_CP1 を使用していますので、iso_1 が非 Unicode 文字のエンコード指定となっている感じですかね。

CREATE DATABASE [COLLATE_TEST] COLLATE Japanese_XJIS_140_CI_AS

というような形で DB を作成することで、任意の照合順序を設定することは MI でも可能です。

(作成後の変更については、ロックが取得できず、うまく実施できなかったため、あとからの変更は厳しいかもしれません)
Japansese を指定したデータベースで先ほどのクエリを実行しても結果は変わりません。
包含データベース に、次のように記載されています。

image

今回は「一時テーブル」でテストを実施していますので、デフォルトの状態では、tempdb の照合順序に依存した動作となっています。

tempdb の照合順序は、サーバーレベルの照合順序が引き継がれますので、MI では「SQL_Latin1_General_CP1_CI_AS」が使われることになります。
この設定では、2 バイト文字を非 Unicode 文字列 (char / varchar) で、一時テーブルで使用しようとした場合に問題が出る可能性がありますね。
ということで、一時テーブルの照合順序を変更したい場合は、「包含データベース」の使用を検討した方がよいかと。

包含データベース化したデータベースで実行されたクエリについては、tempdb やサーバーレベルの照合順序ではなく、カレントの DB の照合順序に各種動作を合わせることができるようになります。
MI はインスタンスレベルの一部の設定を変更できるようになっており、包含データベースについても設定の変更が可能となっています。
次のクエリを実行することで、包含データベースを利用することが可能です。

USE [master]
GO
EXEC sp_configure 'contained database authentication', 1
RECONFIGURE
GO
ALTER DATABASE [COLLATE_TEST] SET CONTAINMENT=PARTIAL
GO

 
包含データベースが有効化され、日本語の照合順序が設定されている DB であれば、このように、一時テーブルのデータに日本語を使用することが可能です。
image
 
MI の照合順序の制御方法の一つとして、包含データベースは覚えておくとよさそうですね。

Share

Written by Masayuki.Ozawa

4月 20th, 2018 at 12:17 am

Leave a Reply