アプリケーションを開発したり、SQLデータベースシステムでコードを記述したりするときは、データがどのようにソートおよび比較されるかを理解することが重要です。データを特定の言語で保存することも、SQLServerで大文字と小文字を区別するデータと大文字と小文字を区別しないデータを別々に処理することもできます。 Microsoftは、 Collationと呼ばれるSQLServer設定を提供しています。 そのような要件を管理し、対処するため。
SQL Serverの照合とは何ですか?
以下に示すように、SQLServerのさまざまなレベルで照合を設定できます。
- サーバーレベル
- データベースレベル
- 列レベル
- 表現レベル
サーバーレベルの照合は、SQLServerインスタンスレベルの照合と呼ばれることもあります。 。
データベースの作成中に特定の照合を選択しなかった場合、データベースレベルの照合はサーバーレベルの照合設定から継承されます。後でデータベースレベルの照合を変更することもできます。データベース照合の変更は、照合の変更後に作成される今後のオブジェクトまたは新しいオブジェクトにのみ適用されることに注意してください。
新しい照合は、最後の照合タイプでソートされたテーブルに格納されている既存のデータを変更しません。新しい照合設定のため、アプリケーションチームは、この保存されたデータ変換を処理するためのさらなる計画を立てる必要があります。
それを行うにはいくつかの方法があります。 1つは、既存のテーブルから新しい照合で作成された新しいテーブルにデータをコピーしてから、古いテーブルを新しいテーブルに置き換えることです。新しい照合を行うことでテーブルデータを新しいデータベースに移動し、古いデータベースを新しいデータベースに置き換えることもできます。
注 :照合の変更は複雑な作業であり、必須のビジネスケースがない限り、それを避ける必要があります。
SQLServerでデータベース照合を検索および変更する方法
先に進んで、SQLServerインスタンスとそのインスタンスでホストされているすべてのデータベースの照合を確認しましょう。データベースまたはインスタンスレベルのプロパティにアクセスして、照合を確認できます。 SQL Server Management Studioを使用するか、以下のT-SQLステートメントを実行するだけでウィンドウを表示できます。各データベースの照合は、システムオブジェクト sys.databasesに保存されます。 –この情報を取得するためにアクセスします。
--Check Database Collation
SELECT name, collation_name
FROM sys.databases
GO
--Check Server or Instance level Collation
SELECT SERVERPROPERTY('Collation') As [Instance Level Collation]
上記のT-SQLステートメントを実行し、以下の出力を取得しました。すべてのデータベースとサーバーレベルの照合には、 SQL_Latin1_General_CP1_CI_ASと同じ設定があることがわかります。 。これは、データベースの照合が作成時にサーバーレベルの照合によって継承され、デフォルト値が変更されていないことを意味します。

それでは、SQL ServerManagementStudioでGUIを使用してデータベースの照合を確認する方法を紹介します。
まず、SQL ServerManagementStudioを使用してSQLServerインスタンスに接続します。インスタンスノードを展開し、続いてデータベースを展開します フォルダ。ターゲットデータベースを右クリックして、プロパティを選択します :

以下のデータベースプロパティが表示されます ウィンドウ。
次に、オプションをクリックします 左側のパネルからタブ。右側のパネルに複数のプロパティ設定が表示されます。 照合 はこのページの最初のプロパティです。上記のT-SQLスクリプトの場合と同じであることがわかります。
同様に、SQL Serverインスタンスノードをクリックして、インスタンスレベルのプロパティを右クリックできます。 サーバーレベルの照合を確認します。

この照合を新しい照合に変更する場合は、照合をクリックするだけです。 ドロップダウンして、必要なオプションを選択します。データベースを完全にバックアップしてから実行してください。

大文字と小文字を区別するSQL_Latin1_General_CP1_ CSと同様の照合を選択しました _AS このデータベースの場合は、[ OK ]をクリックします それを適用します。注:この手順では、ターゲットデータベースに誰も接続していないことを確認してください。接続していない場合は、モードをシングルユーザーモードに切り替える必要があります。 この構成を変更します。

T-SQLステートメントを使用して、このデータベース照合を変更することもできます。そのためには、 COLLATEを使用します ALTERDATABASEステートメントの句。
まず、データベースをシングルユーザーに切り替えました。 モード、次に照合を変更し、最後にデータベースをマルチユーザーに移動しました モード。
--Change Database Collation using T-SQL
USE master;
GO
Alter DATABASE [AdventureWorks2019] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [AdventureWorks2019]
COLLATE SQL_Latin1_General_CP1_CI_AS;
GO
Alter DATABASE [AdventureWorks2019] SET MULTI_USER
SQLServerでサポートされているすべての照合を一覧表示する
このセクションでは、SQLServerで使用可能なすべての照合を見つける方法を説明します。まず、SQLServerインスタンスでサポートされているすべての照合のリストを取得する方法を紹介します。
SQL Serverには、 fn_helpcollations()というシステム関数があります。 これを使用して、すべての照合をフェッチできます。
以下のコマンドを実行してリストを表示します。
--Display the list of all collations
SELECT name, description FROM fn_helpcollations()
出力セクションで、サポートされている5508のすべての照合を確認できます。選択する照合がわからない場合は、以下のスクリプトのWHERE句を使用して、データベースに設定できるすべての可能な照合を除外できます。

データを米国英語で保存し、SQLServerで大文字と小文字を区別する形式で処理する必要があるとします。以下のコマンドを使用して、クエリで可能な照合とサポートされている照合のリストを取得できます。
--Display the list of all collations with WHERE clause
SELECT Name, Description FROM fn_helpcollations()
WHERE Name like 'SQL_Latin1%' AND Description LIKE '%case-sensitive%’
出力には、クエリを満たす10個の照合のみが表示されます。上記のスクリプトを使用して、さまざまな照合を除外できます。

データベース照合の変更がクエリ出力に与える影響
このセクションでは、同じクエリの2つの出力が異なる照合で実行された場合の違いを示します。
まず、 MSSQLという名前のデータベースを作成します 照合付き( SQL_Latin1_General_CP1_ CS _AS )。次に、同じクエリを2回実行して、出力を取得します。後で、照合を SQL_Latin1_General_CP1_ CIに変更します。 _AS もう一度同じクエリを実行して、出力を取得します。両方の出力を比較して、データベース照合を変更した場合の影響を理解できます。それでは、データベースの作成から始めましょう。
次の図に示すように、新しいデータベース作成ウィンドウを起動します。 T-SQLを使用してこのデータベースを作成することもできます。その後、データベース名とそのデータファイルを確認できます。次に、左側のパネルの2番目のタブをクリックして、照合プロパティウィンドウに切り替えます。

このデータベースの照合名がデフォルトであることがわかります。 。これは、このデータベースがサーバーレベルの照合タイプから照合を継承することを意味します。 照合をクリックします ドロップダウンをクリックして、新しい照合を選択します。

以下の照合を選択しましたSQL_Latin1_General_CP1_ CS _AS このデータベースの場合–デフォルトではありません。 OKをクリックします データベースの作成を続行します。

次に、新しく作成されたデータベースのデータベース照合を確認します。 SQL_Latin1_General_CP1_ CSであることがわかります _AS 前の手順で選択したとおりです。

SQL_Latin1_General_CP1_ CS _AS 、 CS 大文字と小文字を区別するの略です モード、および CI 大文字と小文字を区別しないの略です モード。これで、以下のT-SQLコードまたは任意のコードを実行して出力を取得できます。
同じコマンドを2回実行しました。最初のスクリプトは、値 SYSで列名をフィルタリングします 資本 2番目のスクリプトは、同じ値の同じ列をフィルタリングします sys 小さい 手紙。出力セクションは、最初のスクリプトが出力を表示していないのに対し、2番目のスクリプトは大文字と小文字を区別する動作のために出力を表示していることを示しています。
Select * from sysusers
Where name=’SYS’
Go
Select * from sysusers
Where name=’sys’
GO

ここで、このデータベースの照合を大文字と小文字を区別しない照合SQL_Latin1_General_CP1_ CIに変更します。 _AS 以下のT-SQLステートメントを実行します。 SQL Server Management Studioの[データベースのプロパティ]ウィンドウにアクセスして、GUIから変更することもできます。
--Change database collation to SQL_Latin1_General_CP1_CI_AS
USE master;
GO
Alter DATABASE [MSSQL] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [MSSQL]
COLLATE SQL_Latin1_General_CP1_CI_AS;
GO
Alter DATABASE [MSSQL] SET MULTI_USER
上記のスクリプトを一度に実行しましたが、データベースの照合は、大文字と小文字を区別しないサポートを備えた新しい照合に正常に変更されました。

以下のスクリプトを実行して、新しく作成されたデータベースMSSQLの照合を確認することにより、この変更を確認できます。下の画像で、このデータベースに新しい照合が設定されていることがわかります。

照合を変更する前に、同じT-SQLステートメントを再度実行して、この変更の影響を確認します。ご覧のとおり、両方のT-SQLステートメントが出力に含まれています。

結論
SQLServerでの照合が重要であることは明らかだと思います。 SQL Serverの任意のレベルで照合に変更を加えた場合に、どのような影響が生じるかを定義しました。常に適切な計画を立て、ライフサイクルの低い環境で変更を最初にテストしてください。
次の記事にご期待ください。サーバーレベルの照合を変更するための段階的な方法を紹介します。
この記事を共有してフィードバックをお寄せください。改善に役立ちます。