SQL Serverは大文字と小文字を区別しますか?
-
05-07-2019 - |
質問
SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?以前にクエリを実行しました:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
しかし、これは過去に実際に問題を引き起こしてきたため、他の方法を探しています。
編集-もう少し情報:
既存の製品には、多くの事前に作成されたストアドプロシージャがあります。サーバー自体の機密性に応じて、ストアドプロシージャ@test != @TEST
で。したがって、私が探しているのは、サーバーの感度をチェックする最良の方法です。
解決
照合はさまざまなレベルで設定できます:
- サーバー
- データベース
- 列
したがって、大文字と小文字を区別しないデータベースに大文字と小文字を区別する列を作成できます。単一列のデータの大文字と小文字を区別するビジネスケースを作成できる状況にまだ遭遇していませんが、可能性があると思います。
サーバーの照合を確認
SELECT SERVERPROPERTY('COLLATION')
データベース照合を確認
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
列の照合を確認
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
他のヒント
デフォルトの照合オプションを使用して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番目のレコードセットには次の情報が含まれている必要があります。
列名の照合
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'
SQLサーバーは、COLLATION
によって大文字と小文字を区別します。
WHERE
はさまざまなレベルで設定できます。
- サーバーレベル
- データベースレベル
- 列レベル
- 表現レベル
Raj Moreの回答に記載されているように、各レベルで<=>を確認できます。
サーバーの照合を確認
SELECT SERVERPROPERTY('COLLATION')
データベース照合を確認
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
列の照合を確認
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
式の照合順序を確認
式レベル<=>の場合、式を調べる必要があります。 :)
通常は、次の例のように式の最後になります。
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
照合の説明
各<=>値の説明を取得するには、これを試してください。
SELECT * FROM fn_helpcollations()
このように表示されるはずです。
いつでも<=>句を挿入して、フィルタリングして<=>の説明のみを表示できます。
照合のリストは、こちらで確認できます。 。
照合に興味があります。このスニペットに基づいて何かを構築できます:
SELECT DATABASEPROPERTYEX('master', 'Collation');
更新
編集に基づいて<!>#8212; @test
と@TEST
が2つの異なる変数を参照できる場合、それはSQL Serverではありません。 same 変数がそれ自体と等しくない問題が発生した場合は、NULL
が「false」を返すため、その変数がNULL = NULL
かどうかを確認します。
既に作成されたテーブルを操作する最良の方法は、 SQL Serverクエリエディターに移動
タイプ:sp_help <tablename>
これにより、テーブルの構造が表示されます。COLLATE列の下にある目的のフィールドの詳細を参照してください。
次のようにクエリを入力します:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
異なる文字スキーマ<!> lt; SQL_Latin1_General_CP1_CI_AS
<!> gt;である可能性があるため、その列に対して使用された正確なスキーマを見つける方が適切です。
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情報;)を参照してください。
SQL Serverは大文字と小文字を区別しません。 SELECT * FROM SomeTable
はSeLeCT * frOM soMetaBLe
と同じです。