Die anderen vier Antworten sind in unterschiedlichem Maße falsch.
Ich werde alle Missverständnisse hier klären, damit die Leser hoffentlich die am besten geeigneten / effizientesten Entscheidungen treffen können.
Nicht verwenden UPPER()
. Das ist völlig unnötige zusätzliche Arbeit. Verwenden Sie eine COLLATE
Klausel. In beiden Fällen muss ein Zeichenfolgenvergleich durchgeführt werden. Bei der Verwendung UPPER()
muss jedoch auch zeichenweise überprüft werden, ob eine Zuordnung in Großbuchstaben vorliegt, und diese dann geändert werden. Und das müssen Sie auf beiden Seiten tun. Durch COLLATE
das Hinzufügen wird die Verarbeitung einfach angewiesen, die Sortierschlüssel nach einem anderen Regelsatz als standardmäßig zu generieren. Die Verwendung COLLATE
ist definitiv effizienter (oder "performant", wenn Sie dieses Wort mögen :) als die Verwendung UPPER()
, wie in diesem Testskript (auf PasteBin) bewiesen .
Es gibt auch das Problem , das @Ceisc in der Antwort von @ Danny festgestellt hat:
In einigen Sprachen werden keine Konvertierungen durchgeführt. dh UNTER (x)! = UNTER (OBEN (x)).
Das türkische Großbuchstaben "İ" ist das übliche Beispiel.
Nein, die Sortierung ist keine datenbankweite Einstellung, zumindest nicht in diesem Zusammenhang. Es gibt eine Standardkollatierung auf Datenbankebene, die als Standard für geänderte und neu erstellte Spalten verwendet wird, in denen die COLLATE
Klausel nicht angegeben ist (was wahrscheinlich der Grund für dieses häufige Missverständnis ist). Sie wirkt sich jedoch nur dann direkt auf Abfragen aus, wenn Sie es sind Wenn Sie Zeichenfolgenliterale und -variablen mit anderen Zeichenfolgenliteralen und -variablen vergleichen, verweisen Sie auf Metadaten auf Datenbankebene.
Nein, die Sortierung erfolgt nicht pro Abfrage.
Kollatierungen sind pro Prädikat (dh etwas Operand etwas) oder Ausdruck, nicht pro Abfrage. Dies gilt für die gesamte Abfrage, nicht nur für die WHERE
Klausel. Dies umfasst JOINs, GROUP BY, ORDER BY, PARTITION BY usw.
Nein, konvertieren Sie aus folgenden Gründen nicht zu VARBINARY
(z. B. convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
):
- Das ist ein binärer Vergleich, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird (worum es in dieser Frage geht).
- Wenn Sie einen binären Vergleich wünschen, verwenden Sie eine binäre Sortierung. Verwenden Sie eine, die mit endet,
_BIN2
wenn Sie SQL Server 2008 oder höher verwenden. Andernfalls haben Sie keine andere Wahl, als eine zu verwenden, die mit endet _BIN
. Wenn die Daten vorhanden sind, spielt NVARCHAR
es keine Rolle, welches Gebietsschema Sie verwenden, da sie in diesem Fall alle gleich sind und daher Latin1_General_100_BIN2
immer funktionieren. Wenn die Daten VARCHAR
, müssen Sie das gleiche Gebietsschema verwenden , dass die Daten aktuell (zB Latin1_General
, French
, Japanese_XJIS
usw.) , da die locale die Codepage bestimmt , die verwendet wird, und Seiten Code ändern können die Daten (dh Datenverlust) ändern.
- Die Verwendung eines Datentyps variabler Länge ohne Angabe der Größe hängt von der Standardgröße ab. Je nach Kontext, in dem der Datentyp verwendet wird, gibt es zwei unterschiedliche Standardeinstellungen. Es ist entweder 1 oder 30 für Zeichenfolgentypen. Bei Verwendung
CONVERT()
wird der Standardwert 30 verwendet. Die Gefahr besteht darin, dass die Zeichenfolge, wenn sie länger als 30 Byte sein kann, stillschweigend abgeschnitten wird und Sie wahrscheinlich falsche Ergebnisse von diesem Prädikat erhalten.
- Selbst wenn Sie einen Vergleich zwischen Groß- und Kleinschreibung wünschen, wird bei binären Kollatierungen nicht zwischen Groß- und Kleinschreibung unterschieden (ein weiteres sehr häufiges Missverständnis).
Nein, unterscheidet LIKE
nicht immer zwischen Groß- und Kleinschreibung. Es verwendet die Sortierung der Spalte, auf die verwiesen wird, oder die Sortierung der Datenbank, wenn eine Variable mit einem Zeichenfolgenliteral verglichen wird, oder die Sortierung, die über die optionale COLLATE
Klausel angegeben wird.
LCASE
ist keine SQL Server-Funktion. Es scheint entweder Oracle oder MySQL zu sein. Oder möglicherweise Visual Basic?
Da der Kontext der Frage darin besteht, eine Spalte mit einem Zeichenfolgenliteral zu vergleichen, haben hier weder die Sortierung der Instanz (häufig als "Server" bezeichnet) noch die Sortierung der Datenbank direkte Auswirkungen. Kollatierungen werden für jede Spalte gespeichert, und jede Spalte kann eine andere Kollatierung haben. Diese Kollatierungen müssen nicht mit der Standardkollatierung der Datenbank oder der Kollatierung der Instanz identisch sein. Sicher, die Instanzkollatierung ist die Standardeinstellung für das, was eine neu erstellte Datenbank als Standardkollatierung verwendet, wenn die COLLATE
Klausel beim Erstellen der Datenbank nicht angegeben wurde. Ebenso wird die Standardkollatierung der Datenbank von einer geänderten oder neu erstellten Spalte verwendet, wenn die COLLATE
Klausel nicht angegeben wurde.
Sie sollten die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung verwenden, die ansonsten der Sortierung der Spalte entspricht. Verwenden Sie die folgende Abfrage, um die Sortierung der Spalte zu ermitteln (ändern Sie den Namen der Tabelle und den Schemanamen):
SELECT col.*
FROM sys.columns col
WHERE col.[object_id] = OBJECT_ID(N'dbo.TableName')
AND col.[collation_name] IS NOT NULL;
Dann ändere einfach das _CS
Sein _CI
. Also Latin1_General_100_CS_AS
würde werden Latin1_General_100_CI_AS
.
Wenn die Spalte eine binäre Kollatierung verwendet (die mit _BIN
oder endet _BIN2
), suchen Sie eine ähnliche Kollatierung mithilfe der folgenden Abfrage:
SELECT *
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'{CurrentCollationMinus"_BIN"}[_]CI[_]%';
Angenommen, die Spalte verwendet Japanese_XJIS_100_BIN2
: Gehen Sie folgendermaßen vor:
SELECT *
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'Japanese_XJIS_100[_]CI[_]%';
WHERE
Anweisung hinzugefügt werden und wirkt sich auf alleWHERE
Klauseln aus, richtig?