LIKE演算子に関するドキュメントでは、大文字と小文字の区別については何も説明されていません。それは...ですか?それを有効/無効にする方法は?
varchar(n)
重要な場合は、Microsoft SQLServer2005のインストールで列をクエリしています。
LIKE演算子に関するドキュメントでは、大文字と小文字の区別については何も説明されていません。それは...ですか?それを有効/無効にする方法は?
varchar(n)
重要な場合は、Microsoft SQLServer2005のインストールで列をクエリしています。
大文字と小文字を区別するのは演算子ではなく、列自体です。
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
照合についてのこの話はすべて、少し複雑すぎるようです。次のようなものを使用しないのはなぜですか。
IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
次に、照合で大文字と小文字が区別されません。
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;
テーブルの定義時に照合順序を定義するオプションがあります。大文字と小文字を区別する順序を定義すると、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
。
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 ServerManagementStudioで照合を簡単に変更できます。