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.
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.
Antworten:
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_as
wie 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
[A-Z]
immer zwischen Groß- und Kleinschreibung unterscheidet. [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
scheint jedoch der Zusammenstellung zu gehorchen.
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'
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
like 'a%'
ohne Berücksichtigung der Groß- und Kleinschreibung indiziert ist, könnte der Index verwendet werden und die upper
Version nicht.
like
Bediener zwischen Groß- und Kleinschreibung unterscheidet oder nicht .
Latin1_General_CI_AS
, dann tut UPPER(@@VALUE) NOT LIKE '%SOMETHING%'
oder @@COLUMN NOT LIKE '%SOMETHING%'
ist irrelevant: Ergebnis wäre das gleiche.
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 LIKE
wird, verhält sich Ihr Bediener zwischen Groß- und Kleinschreibung. Wenn Sie eine Sortierreihenfolge ohne Berücksichtigung der Groß- und Kleinschreibung definieren, LIKE
ignoriert 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
.
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 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;
WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'
diese zurückgegeben wird, John
da in dieser Kollatierung das Großbuchstaben J
zwischen Klein- j
und Kleinbuchstaben liegt k
. Es ist so, wie aAbBcC...jJkKlLmM...
es nicht offensichtlich ist. Es scheint Latin1_General_BIN
vorhersehbarer mit Bereichssuchen mit LIKE-Operator.
Der like
Operator 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.)
Versuchen Sie zu laufen,
SELECT SERVERPROPERTY('COLLATION')
Finden Sie dann heraus, ob bei Ihrer Sortierung zwischen Groß- und Kleinschreibung unterschieden wird oder nicht.
Sie können die Sortierung einfach in Microsoft SQL Server Management Studio ändern.
LIKE
wird zwischen Groß- und Kleinschreibung unterschieden, wenn dies nicht der Fall ist, dannLIKE
nicht