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.
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.
Yanıtlar:
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
[A-Z]
her zaman büyük / küçük harfe duyarlı değil. [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
ancak harmanlamaya uyuyor gibi görünüyor.
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'
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
like 'a%'
dizini kullanabilir ve upper
sürüm kullanamaz.
like
operatörün büyük / küçük harfe duyarlı olup olmadığıdır .
Latin1_General_CI_AS
, yapmak UPPER(@@VALUE) NOT LIKE '%SOMETHING%'
ya @@COLUMN NOT LIKE '%SOMETHING%'
da alakasızsa: sonuç aynı olacaktır.
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, LIKE
operatö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 LIKE
operatö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
.
Sütun / veritabanı / sunucunun harmanlamasını değiştirmeden büyük / küçük harfe duyarlı bir arama elde etmek istiyorsanız, her zaman COLLATE
cü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;
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 . John
J
j
k
aAbBcC...jJkKlLmM...
Latin1_General_BIN
like
Operatö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.)
Koşmayı dene,
SELECT SERVERPROPERTY('COLLATION')
Ardından, harmanlamanızın büyük / küçük harfe duyarlı olup olmadığını öğrenin.
Microsoft SQL Server Management Studio'da harmanlamayı kolayca değiştirebilirsiniz.
LIKE
büyük / küçük harfe duyarlıdır, değilse, oLIKE
zaman değildir