MSSQLサーバーでLIKE演算子は大文字と小文字を区別しますか?


99

LIKE演算子に関するドキュメントは、何もそれの大文字と小文字の区別について語られていません。それは...ですか?それを有効/無効にする方法は?

必要にvarchar(n)応じて、Microsoft SQL Server 2005のインストールで列を照会しています。


14
列(またはデータベース)の照合順序によって異なります。大文字と小文字を区別する場合は、大文字と小文字を区別します。区別しLIKEない場合は、区別しLIKEません
Lamak

SQL-Serverの照合順序についてのドキュメントを確認してくださいmsdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
GarethD

あなたの目標は何ですか?大文字と小文字を区別しますか、それとも区別しませんか?
アーロンベルトラン

1
大文字と小文字の区別はデフォルトで列の照合になり、照合はデフォルトでデータベースの照合になります。ほとんど丸められますが、どちらに行きたいですか?
トニーホプキンソン2013

回答:


101

大文字と小文字を区別するのは演算子ではなく、列自体です。

SQL Serverのインストールが実行されると、デフォルトの照合順序がインスタンスに対して選択されます。特に明記されていない限り(以下のcollat​​e句を確認してください)、新しいデータベースが作成されるとインスタンスから照合順序が継承され、新しい列が作成されると所属するデータベースから照合順序が継承されます。

のような照合sql_latin1_general_cp1_ci_asは、列のコンテンツの処理方法を決定します。CIは大文字と小文字を区別し、ASはアクセントを区別します。

照合順序の完全なリストは、https://msdn.microsoft.com/en-us/library/ms144250(v = sql.105).aspxにあります

(a)インスタンスの照合順序を確認するには

select serverproperty('collation')

(b)データベースの照合順序を確認するには

select databasepropertyex('databasename', 'collation') sqlcollation

(c)異なる照合順序を使用してデータベースを作成するには

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d)異なる照合を使用して列を作成するには

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)

(e)列の照合順序を変更するには

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null

インスタンスとデータベースの照合順序を変更することは可能ですが、以前に作成されたオブジェクトには影響しません。

文字列比較のためにその場で列の照合順序を変更することも可能ですが、これは非常にコストがかかるため、運用環境ではあまりお勧めできません。

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1

5
のような文字の範囲[A-Z]は、常に大文字と小文字を区別しないようです。[ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]ただし、照合順序に従っているようです。
jumxozizi

1
:また、あなたはこのようなもので、特定の列の大文字小文字の区別を照会することができますselect COLLATION_NAME, iif(cast(COLLATIONPROPERTY(COLLATION_NAME, 'ComparisonStyle') as int) & 1 = 0, 'case sensitive', 'case insensitive') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'exampletable' and COLUMN_NAME = 'examplecolumn'
ジャップスティグ・ニールセン

@jumxozizi提案を回答に追加しました。
John Zabroski、

@JeppeStigNielsen回答に提案を追加しました。
John Zabroski、

18

照合に関するこのすべての話は少し複雑すぎるようです。なぜ次のようなものを使用しないのですか?

IF UPPER(@@VERSION) NOT LIKE '%AZURE%'

次に、照合はどんな照合でも大文字と小文字を区別しません


10
これはsargableではないからです。この例では、変数と先頭のワイルドカードを使用しています。ただし、大文字と小文字を区別しない照合でインデックス付けされた列に対してはインデックスをlike 'a%'使用upperでき、バージョンでは使用できませんでした。
Martin Smith

3
問題は、likeオペレーターが大文字と小文字を区別するかどうかでした。
jumxozizi

照合順序を知っておく必要があります。そうしないと、意味がありません。たとえば、クエリの対象となる列がuses Latin1_General_CI_ASである場合、UPPER(@@VALUE) NOT LIKE '%SOMETHING%'またはor @@COLUMN NOT LIKE '%SOMETHING%'は無関係です。結果は同じになります。
rsenna 2018

13

テーブルを定義するときに照合順序を定義するオプションがあります。大文字と小文字を区別する順序を定義すると、LIKEオペレーターは大文字と小文字を区別するように動作します。大文字と小文字を区別しない照合順序を定義すると、LIKE演算子は大文字と小文字も無視します。

CREATE TABLE Test (
    CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
,   CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
);

以下は、を使用した検索での照合順序の結果を示すsqlfiddleの簡単なデモLIKEです。


12

列/データベース/サーバーの照合順序を変更せずに大文字と小文字を区別した検索を実行したい場合は、常に次のようなCOLLATE句を使用できます。

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 1 row

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CI_AS LIKE 'j%';
-- 2 rows

GO    
DROP TABLE dbo.foo;

列/データベース/サーバーで大文字と小文字が区別され、大文字と小文字を区別したくない場合は、逆の方法でも機能します。たとえば、

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 2 rows

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CS_AS LIKE 'j%';
-- 1 row

GO
DROP TABLE dbo.foo;

この照合では大文字が小文字と小文字の間にあるため、使用WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'すると最後のクエリに注意してください。それは明らかではないようなものです。LIKE演算子を使用した範囲検索の方が予測しやすいようです。JohnJjkaAbBcC...jJkKlLmM...Latin1_General_BIN
wqw 2018

7

likeオペレータは、2つの文字列を取ります。これらの文字列には、ここで説明する互換性のある照合順序が必要です

私の意見では、事態は複雑になります。次のクエリは、照合順序に互換性がないことを示すエラーを返します。

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

ここのランダムマシンでは、デフォルトの照合はSQL_Latin1_General_CP1_CI_ASです。次のクエリは成功しますが、行は返されません。

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

値「abc」と「ABC」は、大文字と小文字が区別される世界では一致しません。

つまり、照合順序がない場合とデフォルトの照合順序を使用する場合には違いがあります。一方の側に照合順序がない場合、もう一方の側から明示的な照合順序が「割り当て」られます。

(明示的な照合が左側にある場合、結果は同じです。)


INFORMATION_SCHEMA.TABLESのようなシステムオブジェクトではないテーブルに対してエラーを再現できますか?
アーロンバートランド

@AaronBertrand。。。はい、できます。データベースは壊れていますか;)?
ゴードンリノフ2013

わからない、今モバイルデバイスを使用していて、Windows VMを起動できない。説明全体が技術的に正確であることを知りません。
アーロンバートランド

4

走ってみて

SELECT SERVERPROPERTY('COLLATION')

次に、照合で大文字と小文字が区別されるかどうかを確認します。



0

Microsoft SQL Server Management Studioで照合順序を簡単に変更できます。

  • テーブルを右クリック->デザイン。
  • 列を選択し、i列のプロパティを[照合順序]までスクロールします。
  • 「大文字と小文字を区別する」をチェックして並べ替えの設定を行います
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.