W dokumentacji dotyczącej operatora LIKE nic nie powiedziano o rozróżnianiu wielkości liter. Czy to jest? Jak to włączyć / wyłączyć?
Sprawdzam varchar(n)
kolumny w instalacji Microsoft SQL Server 2005, jeśli to ma znaczenie.
sql
sql-server-2005
varchar
sql-like
Marcel
źródło
źródło
LIKE
LIKE
Odpowiedzi:
To nie operator rozróżnia wielkość liter, to sama kolumna.
Gdy wykonywana jest instalacja programu SQL Server, do instancji jest wybierane domyślne sortowanie. O ile wyraźnie nie określono inaczej (sprawdź poniższą klauzulę sortowania), gdy tworzona jest nowa baza danych, dziedziczy ona sortowanie z instancji, a po utworzeniu nowej kolumny dziedziczy sortowanie z bazy danych, do której należy.
Kolacja taka jak
sql_latin1_general_cp1_ci_as
dyktuje, jak należy traktować zawartość kolumny. CI oznacza niewrażliwość na wielkość liter, a AS oznacza wrażliwość na akcent.Pełna lista zestawień jest dostępna pod adresem https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx
(a) Aby sprawdzić sortowanie instancji
select serverproperty('collation')
(b) Aby sprawdzić zestawienie w bazie danych
select databasepropertyex('databasename', 'collation') sqlcollation
(c) Tworzenie bazy danych przy użyciu innego sortowania
create database exampledatabase collate sql_latin1_general_cp1_cs_as
(d) Aby utworzyć kolumnę przy użyciu innego sortowania
create table exampletable ( examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null )
(e) Aby zmodyfikować sortowanie kolumn
alter table exampletable alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
Istnieje możliwość zmiany instancji i sortowania bazy danych, ale nie ma to wpływu na wcześniej utworzone obiekty.
Możliwa jest również zmiana sortowania kolumn w locie w celu porównania ciągów, ale jest to wysoce niezalecane w środowisku produkcyjnym, ponieważ jest niezwykle kosztowne.
select column1 collate sql_latin1_general_cp1_ci_as as column1 from table1
źródło
[A-Z]
jest zawsze niewrażliwy na wielkość liter.[ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
jednak wydaje się przestrzegać sortowania.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'
Cała ta rozmowa o zestawianiu wydaje się nieco zbyt skomplikowana. Dlaczego nie użyć czegoś takiego jak:
Wtedy Twój czek nie rozróżnia wielkości liter, niezależnie od zestawienia
źródło
like 'a%'
można użyć indeksu, aupper
wersja nie może.like
operator rozróżnia wielkość liter.Latin1_General_CI_AS
, wtedy robienieUPPER(@@VALUE) NOT LIKE '%SOMETHING%'
lub@@COLUMN NOT LIKE '%SOMETHING%'
jest nieistotne: wynik byłby taki sam.Masz możliwość zdefiniowania kolejności zestawiania w momencie definiowania swojej tabeli. Jeśli zdefiniujesz kolejność uwzględniającą wielkość liter, Twój
LIKE
operator będzie się zachowywał z uwzględnieniem wielkości liter; Jeśli zdefiniujesz kolejność sortowania bez uwzględniania wielkości liter,LIKE
operator zignoruje również wielkość liter: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 );
Tutaj jest szybkie demo na sqlfiddle pokazujące wyniki sortowania dla wyszukiwań z
LIKE
.źródło
Jeśli chcesz uzyskać wyszukiwanie uwzględniające wielkość liter bez zmiany sortowania kolumny / bazy danych / serwera, zawsze możesz użyć
COLLATE
klauzuli, np.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;
Działa też w drugą stronę, jeśli w Twojej kolumnie / bazie danych / serwerze jest rozróżniana wielkość liter i nie chcesz wyszukiwania z uwzględnieniem wielkości liter, np
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;
źródło
WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'
go użyjesz , zwróci,John
ponieważ w tym zestawieniu kapitałJ
jest między małymij
i małymi literamik
. ToaAbBcC...jJkKlLmM...
nie jest oczywiste. Wydaje się, żeLatin1_General_BIN
jest to bardziej przewidywalne w przypadku wyszukiwania zakresów z operatorem LIKE.like
Operator pobiera dwa sznurki. Te ciągi muszą mieć zgodne zestawienia, co zostało wyjaśnione tutaj .Moim zdaniem sprawy się wtedy komplikują. Następujące zapytanie zwraca błąd informujący, że sortowania są niezgodne:
select * from INFORMATION_SCHEMA.TABLES where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS
Na losowej maszynie domyślnym sortowaniem jest
SQL_Latin1_General_CP1_CI_AS
. Następujące zapytanie zakończyło się pomyślnie, ale nie zwraca żadnych wierszy:select * from INFORMATION_SCHEMA.TABLES where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS
Wartości „abc” i „ABC” nie pasują do siebie w świecie z rozróżnianiem wielkości liter.
Innymi słowy, istnieje różnica między brakiem sortowania a użyciem domyślnego sortowania. Gdy jedna strona nie ma sortowania, wówczas jest „przypisywana” jawna kolacja z drugiej strony.
(Wyniki są takie same, gdy jawne sortowanie znajduje się po lewej stronie).
źródło
Spróbuj biegać,
SELECT SERVERPROPERTY('COLLATION')
Następnie sprawdź, czy w sortowaniu rozróżniana jest wielkość liter, czy nie.
źródło
Możesz zmienić z właściwości każdego elementu.
źródło
Możesz łatwo zmienić sortowanie w Microsoft SQL Server Management Studio.
źródło