でLIKE演算子に関するドキュメントは、何もそれの大文字と小文字の区別について語られていません。それは...ですか?それを有効/無効にする方法は?
必要にvarchar(n)
応じて、Microsoft SQL Server 2005のインストールで列を照会しています。
でLIKE演算子に関するドキュメントは、何もそれの大文字と小文字の区別について語られていません。それは...ですか?それを有効/無効にする方法は?
必要にvarchar(n)
応じて、Microsoft SQL Server 2005のインストールで列を照会しています。
回答:
大文字と小文字を区別するのは演算子ではなく、列自体です。
SQL Serverのインストールが実行されると、デフォルトの照合順序がインスタンスに対して選択されます。特に明記されていない限り(以下のcollate句を確認してください)、新しいデータベースが作成されるとインスタンスから照合順序が継承され、新しい列が作成されると所属するデータベースから照合順序が継承されます。
のような照合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
[A-Z]
は、常に大文字と小文字を区別しないようです。[ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
ただし、照合順序に従っているようです。
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'
照合に関するこのすべての話は少し複雑すぎるようです。なぜ次のようなものを使用しないのですか?
IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
次に、照合はどんな照合でも大文字と小文字を区別しません
like 'a%'
使用upper
でき、バージョンでは使用できませんでした。
like
オペレーターが大文字と小文字を区別するかどうかでした。
Latin1_General_CI_AS
である場合、UPPER(@@VALUE) NOT LIKE '%SOMETHING%'
またはor @@COLUMN NOT LIKE '%SOMETHING%'
は無関係です。結果は同じになります。
テーブルを定義するときに照合順序を定義するオプションがあります。大文字と小文字を区別する順序を定義すると、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
です。
列/データベース/サーバーの照合順序を変更せずに大文字と小文字を区別した検索を実行したい場合は、常に次のような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演算子を使用した範囲検索の方が予測しやすいようです。John
J
j
k
aAbBcC...jJkKlLmM...
Latin1_General_BIN
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」は、大文字と小文字が区別される世界では一致しません。
つまり、照合順序がない場合とデフォルトの照合順序を使用する場合には違いがあります。一方の側に照合順序がない場合、もう一方の側から明示的な照合順序が「割り当て」られます。
(明示的な照合が左側にある場合、結果は同じです。)
走ってみて
SELECT SERVERPROPERTY('COLLATION')
次に、照合で大文字と小文字が区別されるかどうかを確認します。
Microsoft SQL Server Management Studioで照合順序を簡単に変更できます。
LIKE
ない場合は、区別しLIKE
ません