LIKE operatörü MSSQL Sunucusunda büyük / küçük harfe duyarlı mı?


101

In GİBİ operatörü belgelerine , hiçbir şey onu küçük harf duyarlılığı hakkında söylenir. Bu mu? Nasıl etkinleştirilir / devre dışı bırakılır?

Eğer önemliyse varchar(n), bir Microsoft SQL Server 2005 kurulumundaki sütunları sorguluyorum.


14
Sütununuzun (veya veritabanınızın) harmanlamasına bağlıdır. Büyük / küçük harfe duyarlıysa, LIKEbüyük / küçük harfe duyarlıdır, değilse, o LIKEzaman değildir
Lamak

SQL-Server harmanlamaları ile ilgili belgeleri kontrol edin msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
GarethD

Amacın ne? Büyük / küçük harfe duyarlı olmasını mı yoksa büyük / küçük harf duyarlı olmamasını mı istiyorsunuz?
Aaron Bertrand

1
Büyük / küçük harf duyarlılığı varsayılan olarak, veritabanındaki varsayılan olan sütundaki harmanlamadır. Çoğunlukla yuvarlanabilir, hangi yöne gitmek istersiniz?
Tony Hopkinson

Yanıtlar:


104

Büyük / küçük harfe duyarlı olan operatör değil, sütunun kendisidir.

Bir SQL Server kurulumu gerçekleştirildiğinde, örnek için varsayılan bir harmanlama seçilir. Açıkça aksi belirtilmedikçe (aşağıdaki harmanlama maddesini kontrol edin) yeni bir veritabanı oluşturulduğunda harmanlamayı örnekten miras alır ve yeni bir sütun oluşturulduğunda harmanlamayı ait olduğu veritabanından devralır.

Benzer bir harmanlama sql_latin1_general_cp1_ci_as, sütunun içeriğinin nasıl ele alınacağını belirler. CI, büyük / küçük harfe duyarlı değildir ve AS, aksan duyarlı anlamına gelir.

Harmanlamaların tam listesi https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx adresinde mevcuttur.

(a) Bir örnek harmanlamasını kontrol etmek için

select serverproperty('collation')

(b) Bir veritabanı harmanlamasını kontrol etmek için

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

(c) Farklı bir harmanlama kullanarak bir veritabanı oluşturmak için

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) Farklı bir harmanlama kullanarak bir sütun oluşturmak için

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

(e) Bir sütun harmanlamasını değiştirmek için

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

Bir örneği ve veritabanı harmanlamalarını değiştirmek mümkündür, ancak önceden oluşturulmuş nesneleri etkilemez.

Dizgi karşılaştırması için bir sütun harmanlamasını anında değiştirmek de mümkündür, ancak bu son derece maliyetli olduğu için bir üretim ortamında son derece tavsiye edilmez.

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1

6
Görünüşe göre karakter aralığı [A-Z]her zaman büyük / küçük harfe duyarlı değil. [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]ancak harmanlamaya uyuyor gibi görünüyor.
jumxozizi

1
Ayrıca, belirli bir sütunun büyük / küçük harf duyarlılığını aşağıdaki gibi bir şeyle sorgulayabilirsiniz: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'
Jeppe Stig Nielsen

@jumxozizi Cevaba önerinizi ekledim.
John Zabroski

@JeppeStigNielsen Önerinizi cevaba ekledim.
John Zabroski

20

Harmanlama hakkındaki tüm bu konuşma biraz fazla karmaşık görünüyor. Neden şöyle bir şey kullanmıyorsunuz:

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

Öyleyse çekiniz, harmanlama ne olursa olsun büyük / küçük harf duyarlıdır


10
Çünkü bu sargılı değil. Örneğiniz bir değişken ve başında bir joker karakter kullanıyor. Ancak büyük / küçük harfe duyarlı olmayan bir harmanlama ile dizine alınmış bir sütuna karşı like 'a%'dizini kullanabilir ve uppersürüm kullanamaz.
Martin Smith

3
Soru, likeoperatörün büyük / küçük harfe duyarlı olup olmadığıdır .
jumxozizi

Harmanlamayı bilmeniz gerekir, aksi takdirde bunu yapmak anlamsız olabilir. Örneğin, sütun kullanımlara karşı sorgulanırsa Latin1_General_CI_AS, yapmak UPPER(@@VALUE) NOT LIKE '%SOMETHING%'ya @@COLUMN NOT LIKE '%SOMETHING%'da alakasızsa: sonuç aynı olacaktır.
rsenna

13

Tablonuzu tanımlarken harmanlama sırasını tanımlama seçeneğiniz vardır . Büyük / küçük harfe duyarlı bir sıra tanımlarsanız, LIKEoperatörünüz büyük / küçük harfe duyarlı bir şekilde davranacaktır; Büyük / küçük harfe duyarlı olmayan bir harmanlama sırası tanımlarsanız LIKEoperatör, büyük / küçük harf kullanımını da göz ardı eder:

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
);

İşte, ile aramalarda harmanlama sırasının sonuçlarını gösteren, sqlfiddle'da hızlı bir demoLIKE .


12

Sütun / veritabanı / sunucunun harmanlamasını değiştirmeden büyük / küçük harfe duyarlı bir arama elde etmek istiyorsanız, her zaman COLLATEcümleci kullanabilirsiniz , örn.

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;

Sütununuz / veritabanınız / sunucunuz büyük / küçük harfe duyarlıysa ve büyük / küçük harfe duyarlı bir arama istemiyorsanız, diğer şekilde de çalışır.

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;

Son sorguda dikkatli olun, eğer kullanırsanız , bu harmanlamadaki büyük harf küçük ve küçük harf arasında olduğu gibi WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'dönecektir . Hangisi açık değil gibi . LIKE operatörü ile aralık aramaları ile daha öngörülebilir görünüyor . JohnJjkaAbBcC...jJkKlLmM...Latin1_General_BIN
wqw

7

likeOperatör iki dizeyi alır. Bu dizelerin, burada açıklanan uyumlu harmanlamalara sahip olması gerekir .

Bence işler daha sonra karmaşıklaşıyor. Aşağıdaki sorgu, harmanlamaların uyumsuz olduğunu belirten bir hata döndürür:

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

Buradaki rastgele bir makinede, varsayılan harmanlama SQL_Latin1_General_CP1_CI_AS. Aşağıdaki sorgu başarılı, ancak hiç satır döndürmüyor:

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

"Abc" ve "ABC" değerleri, büyük / küçük harfe duyarlı bir dünyada eşleşmez.

Başka bir deyişle, hiçbir harmanlama yapmamakla varsayılan harmanlamayı kullanmak arasında bir fark vardır. Bir tarafta harmanlama olmadığında, diğer taraftan açık bir harmanlama "atanır".

(Açık harmanlama solda olduğunda sonuçlar aynıdır.)


Hatayı INFORMATION_SCHEMA.TABLES gibi bir sistem nesnesi OLMAYAN bir tabloya karşı yeniden oluşturabilir misiniz?
Aaron Bertrand

@AaronBertrand. . . Evet yapabilirim. Veritabanı bozuk mu;)?
Gordon Linoff

Bilmiyorum, şu anda bir mobil cihazdayım ve bir Windows sanal makinesini çalıştıramıyorum. Sadece tüm açıklamanızın teknik olarak doğru olduğunu bilmiyorum.
Aaron Bertrand

4

Koşmayı dene,

SELECT SERVERPROPERTY('COLLATION')

Ardından, harmanlamanızın büyük / küçük harfe duyarlı olup olmadığını öğrenin.



0

Microsoft SQL Server Management Studio'da harmanlamayı kolayca değiştirebilirsiniz.

  • sağ tıklama tablosu -> tasarım.
  • sütununuzu seçin, i sütun özelliklerini aşağı kaydırarak Harmanlayın.
  • "Büyük / Küçük Harfe Duyarlı" yı işaretleyerek sıralama tercihinizi ayarlayın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.