Bei dem Operator LIKE wird bei MSSQL Server zwischen Groß- und Kleinschreibung unterschieden?

98

In der Dokumentation zum LIKE-Operator wird nichts über die Groß- und Kleinschreibung angegeben. Ist es? Wie aktiviere / deaktiviere ich es?

Ich frage varchar(n)Spalten in einer Microsoft SQL Server 2005-Installation ab, wenn dies wichtig ist.

Marcel
quelle
14
Dies hängt von der Sortierung Ihrer Spalte (oder Datenbank) ab. Wenn es zwischen Groß- und Kleinschreibung unterscheidet, dann LIKEwird zwischen Groß- und Kleinschreibung unterschieden, wenn dies nicht der Fall ist, dann LIKEnicht
Lamak
Überprüfen Sie die Dokumentation zu SQL-Server- Kollatierungen msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
GarethD
Was ist dein Ziel? Möchten Sie, dass zwischen Groß- und Kleinschreibung unterschieden wird oder nicht?
Aaron Bertrand
1
Die Groß- und Kleinschreibung wird standardmäßig in der Spalte sortiert, die standardmäßig in der Datenbank angezeigt wird. Es ist meistens rund, welchen Weg willst du gehen?
Tony Hopkinson

Antworten:

99

Es ist nicht der Operator, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, sondern die Spalte selbst.

Wenn eine SQL Server-Installation durchgeführt wird, wird eine Standardkollatierung für die Instanz ausgewählt. Sofern nicht ausdrücklich anders angegeben (siehe unten stehende Kollatierungsklausel), erbt eine neue Datenbank beim Erstellen die Kollatierung von der Instanz und beim Erstellen einer neuen Spalte die Kollatierung von der Datenbank, zu der sie gehört.

Eine Sortierung wie bestimmt, sql_latin1_general_cp1_ci_aswie der Inhalt der Spalte behandelt werden soll. CI steht für Groß- und Kleinschreibung und AS für Akzent.

Eine vollständige Liste der Kollatierungen finden Sie unter https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx

(a) Überprüfen einer Instanzsortierung

select serverproperty('collation')

(b) Überprüfen einer Datenbanksortierung

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

(c) Erstellen einer Datenbank mit einer anderen Sortierung

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) Erstellen einer Spalte mit einer anderen Sortierung

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

(e) Ändern einer Spaltenkollatierung

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

Es ist möglich, eine Instanz und Datenbankkollatierungen zu ändern, dies wirkt sich jedoch nicht auf zuvor erstellte Objekte aus.

Es ist auch möglich, eine Spaltenkollatierung für den Zeichenfolgenvergleich im laufenden Betrieb zu ändern. In einer Produktionsumgebung wird dies jedoch dringend empfohlen, da dies äußerst kostspielig ist.

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1
lolol
quelle
5
Es scheint, dass der Bereich der Zeichen [A-Z]immer zwischen Groß- und Kleinschreibung unterscheidet. [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]scheint jedoch der Zusammenstellung zu gehorchen.
Jumxozizi
1
Sie können auch die Groß- und Kleinschreibung einer bestimmten Spalte abfragen: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 Ich habe Ihren Vorschlag zur Antwort hinzugefügt.
John Zabroski
@JeppeStigNielsen Ich habe Ihren Vorschlag zur Antwort hinzugefügt.
John Zabroski
18

Das ganze Gerede über die Zusammenstellung scheint etwas zu kompliziert. Warum nicht einfach so etwas verwenden wie:

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

Dann wird bei Ihrem Scheck unabhängig von der Sortierung die Groß- und Kleinschreibung nicht berücksichtigt

Phil R.
quelle
10
Weil das nicht sargable ist. In Ihrem Beispiel werden eine Variable und ein führender Platzhalter verwendet. Aber für eine Spalte, die mit einer Sortierung like 'a%'ohne Berücksichtigung der Groß- und Kleinschreibung indiziert ist, könnte der Index verwendet werden und die upperVersion nicht.
Martin Smith
3
Die Frage war, ob der likeBediener zwischen Groß- und Kleinschreibung unterscheidet oder nicht .
Jumxozizi
Sie müssen die Sortierung kennen, sonst kann dies sinnlos sein. Zum Beispiel, wenn die Säule vor Verwendungen abgefragten Latin1_General_CI_AS, dann tut UPPER(@@VALUE) NOT LIKE '%SOMETHING%'oder @@COLUMN NOT LIKE '%SOMETHING%'ist irrelevant: Ergebnis wäre das gleiche.
Rsenna
13

Sie haben die Möglichkeit, die Sortierreihenfolge zum Zeitpunkt der Definition Ihrer Tabelle zu definieren . Wenn Sie eine Reihenfolge festlegen, bei der zwischen Groß- und Kleinschreibung unterschieden LIKEwird, verhält sich Ihr Bediener zwischen Groß- und Kleinschreibung. Wenn Sie eine Sortierreihenfolge ohne Berücksichtigung der Groß- und Kleinschreibung definieren, LIKEignoriert der Operator auch die Groß- und Kleinschreibung von Zeichen:

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

Hier ist eine kurze Demo zu sqlfiddle, die die Ergebnisse der Sortierreihenfolge bei Suchvorgängen mit zeigt LIKE.

dasblinkenlight
quelle
12

Wenn Sie eine Suche mit Groß- und Kleinschreibung durchführen möchten, ohne die Sortierung der Spalte / Datenbank / des Servers zu ändern, können Sie immer die COLLATEKlausel verwenden, z

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;

Funktioniert auch umgekehrt, wenn in Ihrer Spalte / Datenbank / Ihrem Server die Groß- und Kleinschreibung beachtet wird und Sie keine Suche nach Groß- und Kleinschreibung wünschen, z

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;
Aaron Bertrand
quelle
Beachten Sie, dass in der letzten Abfrage, wenn Sie sie verwenden, WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'diese zurückgegeben wird, Johnda in dieser Kollatierung das Großbuchstaben Jzwischen Klein- jund Kleinbuchstaben liegt k. Es ist so, wie aAbBcC...jJkKlLmM...es nicht offensichtlich ist. Es scheint Latin1_General_BINvorhersehbarer mit Bereichssuchen mit LIKE-Operator.
wqw
7

Der likeOperator nimmt zwei Zeichenfolgen. Diese Saiten haben kompatibel Sortierungen haben, die erklärt hier .

Meiner Meinung nach werden die Dinge dann kompliziert. Die folgende Abfrage gibt einen Fehler zurück, der besagt, dass die Kollatierungen nicht kompatibel sind:

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

Auf einer zufälligen Maschine ist hier die Standardkollatierung SQL_Latin1_General_CP1_CI_AS. Die folgende Abfrage ist erfolgreich, gibt jedoch keine Zeilen zurück:

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

Die Werte "abc" und "ABC" stimmen in einer Welt mit Groß- und Kleinschreibung nicht überein.

Mit anderen Worten, es gibt einen Unterschied zwischen der fehlenden Sortierung und der Verwendung der Standardkollatierung. Wenn eine Seite keine Sortierung hat, wird ihr eine explizite Sortierung von der anderen Seite "zugewiesen".

(Die Ergebnisse sind dieselben, wenn sich die explizite Sortierung links befindet.)

Gordon Linoff
quelle
Können Sie den Fehler für eine Tabelle reproduzieren, die KEIN Systemobjekt wie INFORMATION_SCHEMA.TABLES ist?
Aaron Bertrand
@ AaronBertrand. . . Ja, ich kann. Ist die Datenbank kaputt;)?
Gordon Linoff
Ich weiß nicht, ich bin gerade auf einem mobilen Gerät und kann keine Windows-VM hochfahren. Ich weiß nur nicht, dass Ihre gesamte Beschreibung technisch korrekt ist.
Aaron Bertrand
4

Versuchen Sie zu laufen,

SELECT SERVERPROPERTY('COLLATION')

Finden Sie dann heraus, ob bei Ihrer Sortierung zwischen Groß- und Kleinschreibung unterschieden wird oder nicht.

RandomUs1r
quelle
1

Sie können die Eigenschaft jedes Elements ändern.

Groß- und Kleinschreibung beachten

Daniel Cadena
quelle
0

Sie können die Sortierung einfach in Microsoft SQL Server Management Studio ändern.

  • Rechtsklick Tabelle -> Design.
  • Wählen Sie Ihre Spalte aus und scrollen Sie in den Spalteneigenschaften nach unten zu Sortierung.
  • Stellen Sie Ihre Sortierpräferenz ein, indem Sie "Groß- und Kleinschreibung beachten" aktivieren.
Anders Finn Jørgensen
quelle