web-dev-qa-db-ja.com

文字列の大文字と小文字を区別しながら、データベースオブジェクトの大文字と小文字を区別できますか?

Microsoft SQL Server(2014)では、大文字と小文字を区別しない照合と大文字と小文字を区別する照合を選択できます。

大文字と小文字を区別する照合を使用する理由は、"test" = "TEST"falseを返すようにするためです。

ただし、保持したいのは、テーブル"TEST"が存在する場合でも、select * from test;のようなクエリを記述しても機能することです。データベースに大文字と小文字を区別する照合がある場合、それはありません。これは、select * from TEST;のように記述する必要があるためです。

「オブジェクト照合」と「文字列照合」を別々に設定する方法はありますか?

3
Wouter

ほとんどが「はい」であり、「オートマジック」ですべてを機能させたいかどうかによって異なります。

最初:データベース識別子の照合順序(つまり、オブジェクト名、列名、インデックス名など)は、データベースのデフォルトの照合順序から取得されます。これにより、sys.objects.nameなどの列の照合順序が決まります。これを行うには、データベースを作成または変更して、Latin1_General_100_CI_AS_SCなどの大文字と小文字を区別しない照合順序を設定します。これにより、select * from test;などのクエリで有効なテーブルTESTを使用できるようになります。

サーバースコープの識別子の照合順序(データベース名など)は、インスタンスのデフォルトの照合順序によって処理されます。

2番目:データベースのデフォルトの照合が大文字と小文字を区別しない場合、完全に文字列リテラルや変数、出力パラメーター、UDFの戻り値である式は、大文字と小文字を区別しないものとして扱われます。これらの式の場合、COLLATE句を使用して、式ごとにそのデフォルトの動作をオーバーライドする必要があります。

例えば:

/* take database default collation behavior */
IF ('test' = 'TEST')
BEGIN
  PRINT 'Case-Insensitive';
END;
ELSE
BEGIN
  PRINT 'Case-Sensitive';
END;
-- ? result depends on the default collation of the "current" database ?


/* force case-sensitive */
IF ('test' = 'TEST' COLLATE Latin1_General_100_CS_AS_SC)
BEGIN
  PRINT 'Case-Insensitive';
END;
ELSE
BEGIN
  PRINT 'Case-Sensitive';
END;
-- Case-Sensitive


/* force case-insensitive */
IF ('test' = 'TEST' COLLATE Latin1_General_100_CI_AS_SC)
BEGIN
  PRINT 'Case-Insensitive';
END;
ELSE
BEGIN
  PRINT 'Case-Sensitive';
END;
-- Case-Insensitive

文字列列と文字列リテラルまたは変数の間の式は、文字列列の照合順序を使用します。列の照合順序で大文字と小文字が区別される場合、式はCOLLATE句。

デフォルトでは、notを指定して新しく作成された列はCOLLATE句を指定し、データベースのデフォルトの照合を継承します。この場合、4つのカテゴリすべてで機密にしたいすべてのVARCHAR/NVARCHAR列に対して、COLLATE Latin1_General_100_CS_AS_KS_WS_SCのようなものを指定する必要があります(さらに、補助文字をサポートします)。

注意:バイナリ照合順序(Latin1_General_100_BIN2)を使用してアクセント/ケース/カナ/幅に敏感な照合順序を取得する場合は、十分に注意してください。バイナリ照合順序はnot本当に大文字小文字を区別します。

5
Solomon Rutzky