wake-up-neo.com

Unterscheidet der LIKE-Operator bei MSSQL Server zwischen Groß- und Kleinschreibung?

In der Dokumentation zum LIKE-Operator wird nichts über die Groß- und Kleinschreibung des Operators gesagt. Ist es? Wie kann ich es aktivieren/deaktivieren?

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

85
Marcel

Es ist nicht der Operator, der zwischen Groß- und Kleinschreibung unterscheidet, sondern die Spalte selbst.

Bei einer SQL Server-Installation 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 Zusammenstellung wie sql_latin1_general_cp1_ci_as bestimmt, wie der Inhalt der Spalte behandelt werden soll. CI steht für case insensitive und AS für accent sensitive.

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

(a) So überprüfen Sie eine Instanzsortierung

select serverproperty('collation')

(b) So überprüfen Sie eine Datenbanksortierung

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

(c) So erstellen Sie eine Datenbank mit einer anderen Kollatierung

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) So erstellen Sie eine Spalte mit einer anderen Kollatierung

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

(e) So ändern Sie eine Spaltensortierung

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

Es ist möglich, Instanz- und Datenbankkollatierungen zu ändern, dies hat jedoch keine Auswirkungen auf zuvor erstellte Objekte.

Es ist auch möglich, eine Spaltensortierung im laufenden Betrieb für einen Zeichenfolgenvergleich zu ändern. Dies wird jedoch in einer Produktionsumgebung nicht empfohlen, da dies sehr kostspielig ist.

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1
87
lolol

Das ganze Gerede über das Sortieren scheint etwas zu kompliziert. Warum nicht einfach so etwas wie:

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

Dann ist Ihr Scheck unabhängig von der Sortierung zwischen Groß- und Kleinschreibung

15
Phil R

Sie haben die Möglichkeit, die Sortierreihenfolge zum Zeitpunkt der Definition Ihrer Tabelle zu definieren . Wenn Sie eine Reihenfolge definieren, bei der zwischen Groß- und Kleinschreibung unterschieden wird, wird der Operator LIKE zwischen Groß- und Kleinschreibung unterscheiden. Wenn Sie eine Sortierreihenfolge definieren, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, ignoriert der Operator LIKE auch die Groß- und Kleinschreibung:

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 Suchen mit LIKE anzeigt.

14
dasblinkenlight

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 COLLATE -Klausel 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 in umgekehrter Richtung, wenn in Ihrer Spalte/Datenbank/Ihrem Server die Groß-/Kleinschreibung beachtet wird und Sie keine Suche in Groß-/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;
11
Aaron Bertrand

Der Operator like akzeptiert zwei Zeichenfolgen. Diese Zeichenketten müssen kompatible Kollatierungen haben, was erklärt wird hier .

Meiner Meinung nach wird es 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 die Standardkollation 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 ohne Berücksichtigung der Groß- und Kleinschreibung nicht überein.

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

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

5
Gordon Linoff

Versuche zu rennen,

SELECT SERVERPROPERTY('COLLATION')

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

3
RandomUs1r

Sie können die Eigenschaften jedes Artikels ändern.

case sensitive

1
Daniel Cadena

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 nach unten in den Spalteneigenschaften zu Kollatierung.
  • Stellen Sie Ihre Sortierung ein, indem Sie "Groß- und Kleinschreibung beachten" aktivieren.