[アップデート] Amazon RDS for SQL Server で サーバーレベルの照合順序が変更できるようになりました
みなさま Xin chao !
このたび、Amazon RDS for SQL Server で、サーバーレベルの照合順序の変更がサポートされましたので、さっそく試してみました。
Amazon RDS SQL Server now supports changing the server-level collation
照合順序とは
文字の大小関係を比較する際の基準を、照合順序と呼びます。
数値と異なり、文字の大小関係が必要なのか? と思うかもしれませんが、検索するたびに検索結果の順序が異なっては困ってしまいます。 また、使用する言語によっては期待する文字列の順序が異なる場合もあります。 そのような理由から、文字についても大小関係を比較する基準が必要となります。
これまで
照合順序は、サーバーレベルで指定する照合順序と、データベースレベルで指定する照合順序があり、これまで Amazon RDS for SQL Server では、サーバーレベルの照合順序をデフォルト値から変更することができず、デフォルト値と異なる照合順序を使用したい場合は、データベースレベルで別の照合順序を指定する必要がありました。
Microsoft SQL Server DB インスタンスを作成すると、Amazon RDS によって文字セットのデフォルトサーバー照合順序が作成されます。このデフォルトサーバー照合順序は、現時点では英語 (米国)、より正確には SQL_Latin1_General_CP1_CI_AS です。デフォルト照合順序は、新しいデータベースまたはデータベースオブジェクトを作成する際に、照合順序を上書きすることにより、データベース、テーブル、または列レベルで変更できます。たとえば、デフォルト照合順序の SQL_Latin1_General_CP1_CI_AS から、日本語照合順序をサポートする Japanese_CI_AS に変更できます。
Amazon Relational Database Service ユーザーガイド (2019/8/7 現在) より抜粋
これから
Amazon RDS for SQL Server のインスタンスを開始する際に、サーバーレベルの照合順序を変更できるようになりました。 ただし、インスタンス開始時のみ変更可能で、インスタンス起動後は変更できませんのでご注意ください。
試してみた
Amazon RDS for SQL Server を 2 インスタンス起動します。
インスタンス sql-collation-default
サーバーレベルの照合順序を SQL_Latin1_General_CP1_CI_AS (=デフォルト値) で起動します。
SQL Server Management Studio で接続し、サーバーレベルの照合順序を確認すると、デフォルトの照合順序になっています。
SELECT CONVERT (varchar, SERVERPROPERTY('collation'));
テスト用のデータベースを作成します。
CREATE DATABASE collation_default_db;
照合順序を指定せずにデータベースを作成したので、データベースレベルの照合順序はサーバーレベルと同じになっています。
SELECT name, collation_name FROM sys.databases WHERE name = N'collation_default_db';
テーブルを作成し、データを挿入してみます。
USE collation_default_db; CREATE TABLE collation_default_table ( column1 varchar(10) );
INSERT INTO collation_default_table VALUES ('aaaあああ'), ('BBBいいい'), ('cccううう');
テーブルの内容を確認すると、非 Unicode 型の文字データにおいて日本語をサポートしていない照合順序を使用しているため、日本語が文字化けしています。
SELECT * FROM collation_default_table ORDER BY column1;
インスタンス sql-collation-japanese
サーバーレベルの照合順序を Japanese_CI_AS に変更して起動します。 これまでは、この設定項目が存在しませんでした。
SQL Server Management Studio で接続し、サーバーレベルの照合順序を確認すると、確かに照合順序が変更されています。
SELECT CONVERT (varchar, SERVERPROPERTY('collation'));
テスト用のデータベースを作成します。
CREATE DATABASE collation_default_db;
照合順序を指定せずにデータベースを作成したので、データベースレベルの照合順序はサーバーレベルと同じになっています。
SELECT name, collation_name FROM sys.databases WHERE name = N'collation_japanese_db';
テーブルを作成し、データを挿入してみます。
USE collation_japanese_db; CREATE TABLE collation_japanese_table ( column1 varchar(10) );
INSERT INTO collation_japanese_table VALUES ('aaaあああ'), ('BBBいいい'), ('cccううう');
テーブルの内容を確認すると、日本語が正常に格納されています。
SELECT * FROM collation_japanese_table ORDER BY column1;
まとめ
AWS 環境で Microsoft SQL Server を使用する場合、運用面などを考慮するとマネージドサービスである Amazon RDS for SQL Server を積極的に選択したいところですが、パッケージアプリケーションなどの既存アプリケーションと組み合わせて使用する場合、アプリケーションのカスタマイズが難しいことから、Amazon RDS for SQL Server の制約事項に該当してしまうと、SQL Server on EC2 を選択せざるを得ない場面も多いかと思います。
今回、Amazon RDS for SQL Server を使用する際の制約事項が 1 つ減ったことにより、Amazon RDS for SQL Server を使用するハードルが 1 つ下がったのではないかと思います。 もし、これまで照合順序の問題で Amazon RDS for SQL Server を選択できなかった場合は、ぜひ今回のアップデートを試していただければ幸いです。