web-dev-qa-db-ja.com

SQL Serverは大文字と小文字を区別しますか?

SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?以前にクエリを実行しました:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END

しかし、これは実際に過去の問題を与えてくれたので、他の方法を探しています。

編集-もう少し情報:既存の製品には、多くの事前に作成されたストアドプロシージャがあります。ストアドプロシージャ@test != @TESTサーバー自体の感度に依存します。したがって、私が探しているのは、サーバーの感度をチェックする最良の方法です。

47
Kyle

照合はさまざまなレベルで設定できます。

  1. サーバ
  2. データベース
  3. カラム

したがって、大文字と小文字を区別しないデータベースに大文字と小文字を区別する列を作成できます。単一のデータ列の大文字と小文字を区別するビジネスケースを作成できる状況にはまだ遭遇していませんが、可能性があると思います。

サーバー照合を確認

SELECT SERVERPROPERTY('COLLATION')

データベース照合を確認

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

列の照合を確認

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
71
Raj More

SQL Serverをデフォルトの照合オプションでインストールした場合、次のクエリが同じ結果を返すことがあります。

CREATE TABLE mytable 
( 
    mycolumn VARCHAR(10) 
) 
GO 

SET NOCOUNT ON 

INSERT mytable VALUES('Case') 
GO 

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

列レベルで照合を強制することにより、クエリを変更できます。

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'case' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case' 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SELECT DATABASEPROPERTYEX('<database name>', 'Collation') 

この設定を変更すると、アプリケーションとSQLクエリに影響を与える可能性があるため、最初にこのテストを分離します。 SQL Server 2000から、ALTER TABLEステートメントを簡単に実行して、特定の列の並べ替え順序を変更し、大文字と小文字を区別することができます。まず、次のクエリを実行して、変更する必要があるものを判断します。

EXEC sp_help 'mytable' 

デフォルトのシナリオでは、2番目のレコードセットには次の情報が含まれている必要があります。

Column_Name照合


mycolumn SQL_Latin1_General_CP1_CI_AS

[照合順序]列が何を返したとしても、次の変更を行った後に元に戻す必要があることがわかります。これにより、大文字と小文字が区別されます。

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE Latin1_General_CS_AS 
GO 



SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

これがうまくいかない場合は、新しいALTER TABLEステートメントを発行するだけで元に戻すことができます(COLLATE識別子を以前に見つけたものに置き換えてください)。

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 

SQL Server 7.0にこだわっている場合は、この回避策を試すことができますが、これはもう少しパフォーマンスに影響する可能性があります(最初の一致に対してのみ結果を取得する必要があります)。

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10)) 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 
33

SQLサーバーは、COLLATIONによって大文字と小文字を区別します。

COLLATIONはさまざまなレベルで設定できます。

  1. サーバーレベル
  2. データベースレベル
  3. 列レベル
  4. 式レベル

MSDNリファレンスです。

Raj Moreの答え で述べたように、各レベルでCOLLATIONを確認できます。

サーバー照合をチェック

SELECT SERVERPROPERTY('COLLATION')

データベース照合のチェック

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

列の照合をチェック

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name

式照合をチェック

式レベルCOLLATIONの場合、式を調べる必要があります。 :)

以下の例のように、通常は式の最後になります。

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

照合の説明

COLLATION値の説明を取得するには、これを試してください。

SELECT * FROM fn_helpcollations()

そして、あなたはこのような何かを見るはずです。

enter image description here

WHERE句をいつでも配置して、COLLATIONの説明のみをフィルタリングおよび表示できます。

照合リスト ここ を見つけることができます。

7
Devraj Gadhavi

照合に興味があります。このスニペットに基づいて何かを構築できます:

SELECT DATABASEPROPERTYEX('master', 'Collation');

更新
編集内容に基づく— @test@TESTが2つの異なる変数を参照できる場合、それはSQL Serverではありません。 same変数がそれ自体と等しくない問題が発生した場合は、NULL = NULLが返されるため、その変数がNULLであるかどうかを確認してください。 `false。

4
Joel Coehoorn

作成済みのテーブルを操作する最良の方法は、SQL Serverクエリエディターに移動することです。

タイプ:sp_help <tablename>

これにより、テーブルの構造が表示されます。COLLATE列の下にある目的のフィールドの詳細を参照してください。

次に、クエリを次のように入力します。

SELECT myColumn FROM myTable  
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'

異なる文字スキーマ<SQL_Latin1_General_CP1_CI_AS>、その列に対して使用された正確なスキーマを見つける方が良い。

2
DareDevil

SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?

情報に基づいたデータベースを返す以下のクエリを使用できます。

;WITH collations AS (
    SELECT 
        name,
        CASE 
            WHEN description like '%case-insensitive%' THEN 0 
            WHEN description like '%case-sensitive%' THEN 1 
        END isCaseSensitive
    FROM 
        sys.fn_helpcollations()
)
SELECT *
FROM collations
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));

詳細については このMSDN情報 ;)を参照してください。

1
shA.t