Was macht 'COLLATE SQL_Latin1_General_CP1_CI_AS'?

134

Ich habe eine SQL-Abfrage zum Erstellen der Datenbank in SQLServer wie folgt:

create database yourdb
on
( name = 'yourdb_dat',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
  size = 25mb,
  maxsize = 1500mb,
  filegrowth = 10mb )
log on
( name = 'yourdb_log',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
  size = 7mb,
  maxsize = 375mb,
  filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go

Es läuft gut.

Während der Rest der SQL klar ist, bin ich ziemlich verwirrt über die Funktionalität von COLLATE SQL_Latin1_General_CP1_CI_AS.

Kann mir das jemand erklären? Außerdem möchte ich wissen, ob das Erstellen der Datenbank auf diese Weise eine bewährte Methode ist.

Donner
quelle

Antworten:

246

Hiermit wird festgelegt, wie der Datenbankserver sortiert (Textteile werden verglichen). in diesem Fall:

SQL_Latin1_General_CP1_CI_AS

zerfällt in interessante Teile:

  1. latin1 Lässt den Server Zeichenfolgen mit Zeichensatz Latin 1 behandeln, im Grunde ASCII
  2. CP1 steht für Code Page 1252
  3. CI Groß- und Kleinschreibung wird nicht berücksichtigt, sodass 'ABC' gleich 'abc' ist.
  4. AS akzentempfindlich, daher ist 'ü' nicht gleich 'u'

PS Für detailliertere Informationen lesen Sie bitte die Antwort von @ solomon-rutzky .

Kris
quelle
11
Was wäre der Unterschied zwischen diesem und SQL_Latin1_General_CI_AS. Insbesondere CP1 hat mich gefragt.
Kad
7
@Kad: Es scheint keine zu geben SQL_Latin1_General_CI_AS. Vielmehr gibt es eine Latin1_General_CI_AS. Siehe SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. Es gibt subtile Unterschiede in Bezug auf Sortierung und Vergleich zwischen den beiden Kollatierungen. Siehe olcot.co.uk/sql-blogs/… .
Riley Major
4
@Kad: CP1 steht für Code Page 1252. Eine Codepage ist eine Nachschlagetabelle, um den Hex-Wert einem bestimmten Zeichen in einem Zeichensatz zuzuordnen. CP1 ist eine Abkürzung für CP1252 in der Microsoft-Subkultur. Windows ist die einzige Plattform, die CP1252 einheimisch verwendet, da es ein Überbleibsel aus DOS-Tagen ist. Obwohl es ISO 8859-1 sehr ähnlich ist, sind sie nicht gleich. Es gibt Unterschiede bei zugeordneten Zeichen wie dem Euro und einigen anderen, die nicht in ISO 8859-1 enthalten sind.
Slartibartfast
makellose Antwort @Kris!
Gaurav
@Kris Gibt es eine UTF-8-Alternative für SQL_Latin1_General_CP1_CI_AS in SQL2019?
Chanky
71

Bitte beachten Sie, dass die akzeptierte Antwort etwas unvollständig ist. Ja, auf der einfachsten Ebene übernimmt Collation das Sortieren. ABER die durch die ausgewählte Sortierung definierten Vergleichsregeln werden an vielen Stellen außerhalb von Benutzerabfragen für Benutzerdaten verwendet.

Wenn "Was macht COLLATE SQL_Latin1_General_CP1_CI_AS?" bedeutet "Was macht die COLLATEKlausel von CREATE DATABASE?", dann:

Die COLLATE {collation_name}Klausel der CREATE DATABASEAnweisung gibt die Standardkollatierung der Datenbank und nicht des Servers an. Standardkollatierungen auf Datenbankebene und Serverebene steuern verschiedene Dinge.

Steuerelemente auf Server- (dh Instanz-) Ebene :

  • Datenbank-Ebene Sortierungs für die Systemdatenbanken: master, model, msdb, und tempdb.
  • Aufgrund der Steuerung der Sortierung auf DB-Ebene von tempdbist dies dann die Standardkollatierung für Zeichenfolgenspalten in temporären Tabellen (global und lokal), jedoch nicht für Tabellenvariablen.
  • Durch die DB-Ebene Steuerung von Sortierungs master, es ist dann die Sortierungs für verwendeten Server-Level - Daten, wie zB Datenbanknamen (dh nameSpalte sys.databases), Login - Namen, usw.
  • Umgang mit Parameter- / Variablennamen
  • Umgang mit Cursornamen
  • Umgang mit GOTOEtiketten
  • Standardkollatierung, die für neu erstellte Datenbanken verwendet wird, wenn die COLLATEKlausel fehlt

Steuerelemente auf Datenbankebene :

  • Standardkollatierung verwendet für neu erstellte Zeichenfolge Spalten ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT, und NTEXT- aber nicht verwenden , TEXToder NTEXT) , wenn die COLLATEKlausel aus der Spaltendefinition fehlt. Dies gilt sowohl für CREATE TABLEals auch für ALTER TABLE ... ADDAussagen.
  • Standardkollatierung für Zeichenfolgenliterale (dh 'some text') und Zeichenfolgenvariablen (dh @StringVariable). Diese Sortierung wird immer nur verwendet, wenn Zeichenfolgen und Variablen mit anderen Zeichenfolgen und Variablen verglichen werden. Beim Vergleich von Zeichenfolgen / Variablen mit Spalten wird die Sortierung der Spalte verwendet.
  • Die für Metadaten auf Datenbankebene verwendete Sortierung , z. B. Objektnamen (dh sys.objects), Spaltennamen (dh sys.columns), Indexnamen (dh sys.indexes) usw.
  • Die für Objekte auf Datenbankebene verwendete Sortierung : Tabellen, Spalten, Indizes usw.

Ebenfalls:

  • ASCII ist eine 8-Bit-Codierung (für die allgemeine Verwendung; technisch gesehen ist "ASCII" 7-Bit mit den Zeichenwerten 0 bis 127 und "ASCII Extended" 8-Bit mit den Zeichenwerten 0 bis 255). Diese Gruppe ist in allen Kulturen gleich.
  • Die Codepage ist der "erweiterte" Teil von Extended ASCII und steuert, welche Zeichen für die Werte 128 - 255 verwendet werden. Diese Gruppe variiert zwischen den einzelnen Kulturen.
  • Latin1bedeutet nicht "ASCII", da Standard-ASCII nur die Werte 0 bis 127 abdeckt und alle Codepages (die in SQL Server und sogar dargestellt werden können NVARCHAR) dieselben 128 Werte denselben Zeichen zuordnen.

Wenn "Was macht COLLATE SQL_Latin1_General_CP1_CI_AS?" bedeutet "Was macht diese bestimmte Zusammenstellung?", dann:

  • Da der Name mit beginnt SQL_, handelt es sich um eine SQL Server-Sortierung, nicht um eine Windows-Sortierung. Diese sind definitiv veraltet, auch wenn sie nicht offiziell veraltet sind, und dienen hauptsächlich der Kompatibilität vor SQL Server 2000. Obwohl dies leider SQL_Latin1_General_CP1_CI_ASsehr häufig vorkommt, da es die Standardeinstellung bei der Installation auf einem Betriebssystem mit US-Englisch als Sprache ist. Diese Zusammenstellungen sollten nach Möglichkeit vermieden werden.

    Windows-Kollatierungen (solche mit Namen, die nicht mit beginnen SQL_) sind neuer, funktionaler, haben eine konsistente Sortierung zwischen VARCHARund NVARCHARfür dieselben Werte und werden mit zusätzlichen / korrigierten Sortiergewichten und Zuordnungen in Groß- / Kleinbuchstaben aktualisiert. Diese Kollatierungen haben auch nicht das potenzielle Leistungsproblem, das die SQL Server-Kollatierungen haben: Auswirkungen auf Indizes beim Mischen von VARCHAR- und NVARCHAR-Typen .

  • Latin1_General ist die Kultur / das Gebietsschema.
    • Für NCHAR,, NVARCHARund NTEXTDaten bestimmt dies die Sprachregeln, die zum Sortieren und Vergleichen verwendet werden.
    • Für CHAR, VARCHARund TEXTDaten (Spalten, Literale und Variablen) bestimmt dies die:
      • Sprachregeln zum Sortieren und Vergleichen.
      • Codepage zum Codieren der Zeichen. Beispielsweise verwenden Latin1_GeneralKollatierungen die Codepage 1252, HebrewKollatierungen die Codepage 1255 usw.
  • CP{code_page} oder {version}

    • Für SQL Server- Kollatierungen: CP{code_page}ist die 8-Bit-Codepage, die bestimmt, welche Zeichen den Werten 128 bis 255 zugeordnet werden. Es gibt vier Codepages für Doppelbyte-Zeichensätze (DBCS), die 2-Byte-Kombinationen verwenden können, um mehr als zu erstellen 256 Zeichen, diese sind für die SQL Server-Sortierungen nicht verfügbar.
    • Für Windows- Kollatierungen: {version}Bezieht sich, obwohl nicht in allen Kollatierungsnamen vorhanden, auf die SQL Server-Version, in der die Kollatierung (größtenteils) eingeführt wurde. Windows-Kollatierungen ohne Versionsnummer im Namen sind Version 80(dh SQL Server 2000 als Version 8.0). Nicht alle Versionen von SQL Server werden mit neuen Sortierungen geliefert, daher gibt es Lücken in den Versionsnummern. Es gibt einige 90(für SQL Server 2005, Version 9.0), die meisten 100(für SQL Server 2008, Version 10.0) und eine kleine Gruppe 140(für SQL Server 2017, Version 14.0).

      Ich sagte "größtenteils", weil die Kollatierungen, die mit enden _SC, in SQL Server 2012 (Version 11.0) eingeführt wurden, aber die zugrunde liegenden Daten nicht neu waren. Sie fügten lediglich Unterstützung für zusätzliche Zeichen für die integrierten Funktionen hinzu. Diese Endungen existieren also für Version 90und 100Sortierungen, beginnen jedoch erst in SQL Server 2012.

  • Als nächstes haben Sie die Empfindlichkeiten, die in einer beliebigen Kombination der folgenden sein können, aber immer in dieser Reihenfolge angegeben werden:
    • CS= Groß- und Kleinschreibung beachten oder CI= Groß- und Kleinschreibung nicht berücksichtigen
    • AS= akzentempfindlich oder AI= akzentunempfindlich
    • KS = Kana typempfindlich oder fehlt = Kana typunempfindlich
    • WS = Breitensensitiv oder fehlend = Breitenunempfindlich
    • VSS = Variationswähler empfindlich (nur in den Kollatierungen der Version 140 verfügbar) oder fehlt = Variationswähler unempfindlich
  • Optionales letztes Stück:

    • _SCam Ende bedeutet "Zusätzliche Zeichenunterstützung". Die "Unterstützung" wirkt sich nur darauf aus, wie die integrierten Funktionen Ersatzpaare interpretieren (wie zusätzliche Zeichen in UTF-16 codiert werden). Ohne _SCam Ende (oder _140_in der Mitte) sehen eingebaute Funktionen kein einziges Zusatzzeichen, sondern zwei bedeutungslose Codepunkte, aus denen das Ersatzpaar besteht. Dieses Ende kann zu jeder nicht-binären Kollatierung der Version 90 oder 100 hinzugefügt werden.
    • _BINoder _BIN2am Ende bedeutet "binäre" Sortierung und Vergleich. Die Daten werden immer noch gleich gespeichert, es gibt jedoch keine sprachlichen Regeln. Dieses Ende wird niemals mit einer der 5 Empfindlichkeiten oder kombiniert _SC. _BINist der ältere Stil und _BIN2ist der neuere, genauere Stil. Wenn Sie SQL Server 2005 oder höher verwenden, verwenden Sie _BIN2. Einzelheiten zu den Unterschieden zwischen _BINund _BIN2finden Sie unter: Unterschiede zwischen den verschiedenen binären Kollatierungen (Kulturen, Versionen und BIN vs BIN2) .
    • _UTF8ist eine neue Option ab SQL Server 2019. Es handelt sich um eine 8-Bit-Codierung, mit der Unicode-Daten VARCHARund CHARDatentypen (jedoch nicht der veraltete TEXTDatentyp) gespeichert werden können . Diese Option kann nur für Kollatierungen verwendet werden, die zusätzliche Zeichen unterstützen (dh Kollatierungen der Version 90 oder 100 mit _SCihrem Namen und Kollatierungen der Version 140). Es gibt auch eine einzelne binäre _UTF8Kollatierung ( _BIN2nicht _BIN).

      BITTE BEACHTEN SIE: UTF-8 wurde für die Kompatibilität mit Umgebungen / Code entwickelt, die für 8-Bit-Codierungen eingerichtet sind, jedoch Unicode unterstützen möchten. Obwohl es einige Szenarien gibt, in denen UTF-8 im Vergleich zu bis zu 50% Platz sparen NVARCHARkann, ist dies ein Nebeneffekt und verursacht bei vielen / den meisten Vorgängen einen leichten Leistungseinbruch. Wenn Sie dies aus Kompatibilitätsgründen benötigen, sind die Kosten akzeptabel. Wenn Sie dies aus Platzgründen wünschen, sollten Sie besser testen und WIEDER TESTEN. Das Testen umfasst alle Funktionen und mehr als nur einige Datenzeilen. Seien Sie gewarnt, dass UTF-8-Kollatierungen am besten funktionieren, wenn ALLE Spalten und die Datenbank selbst VARCHARDaten (Spalten, Variablen, Zeichenfolgenliterale) mit a verwenden_UTF8Kollation. Dies ist der natürliche Zustand für alle, die dies aus Kompatibilitätsgründen verwenden, aber nicht für diejenigen, die es aus Platzgründen nutzen möchten. Seien Sie vorsichtig, wenn Sie VARCHAR-Daten mithilfe einer _UTF8Kollatierung mit VARCHARDaten mischen, die keine Kollatierungen _UTF8oder NVARCHARDaten verwenden, da dies zu merkwürdigem Verhalten / Datenverlust führen kann. Weitere Informationen zu den neuen UTF-8-Kollatierungen finden Sie unter: Native UTF-8-Unterstützung in SQL Server 2019: Retter oder falscher Prophet?

Solomon Rutzky
quelle
5
Obwohl ich dies für so viele Informationen und Anstrengungen positiv bewertet habe, ist meine Antwort definitiv nicht falsch (Datenbanken speichern Daten, Datenbankserver verarbeiten diese Daten, Sortieren wird ausgeführt). Ich entschied mich für Kürze gegenüber vollständiger mathematischer Präzision, weil das OP wahrscheinlich nach genug und nicht nach allen möglichen Informationen suchte.
Kris
4
Hallo @Kris. Vielen Dank. Um fair zu sein, ich habe nicht gesagt, dass Ihre Antwort völlig falsch war, nur kläglich unvollständig. Ich habe aktualisiert, um dies hoffentlich zu klären. Ich verstehe, was Sie sagen, aber das OP hat gefragt, was die COLLATEKlausel von CREATE DATABASEtut. Sie haben eines von mehreren Dingen gesagt, die es tut. Warum nehmen Sie an, dass das OP nur 10% der Antwort wissen möchte? Wenn alle Informationen angezeigt werden, kann jede Person entscheiden, wie viel davon sie nehmen soll. Wenn jedoch nur einige Informationen angegeben werden, wurde die Wahl für sie getroffen. Ich beschließe, so viele Informationen wie möglich bereitzustellen, da das meiste davon nicht bekannt ist. (Fortsetzung)
Solomon Rutzky
5
Ich denke, ich verstehe, was du meinst, aber ich möchte nicht genug, sondern genug Informationen geben. Zu viele Informationen werden für viele Menschen schnell zu kompliziert. und wenn ich nicht genügend Informationen für einen Umstand gebe, erwarte ich weitere Fragen. (Ich habe auch nicht so viel Aufmerksamkeit für das Thema erwartet)
Kris
8
@Kris Ich wollte schon eine Weile "Danke!" für diese Reife und Professionalität zu zeigen. Ich bin es etwas gewohnt, dass Leute jemanden persönlich beleidigen, der sagt, dass er falsch liegt, und dann "schwierig" (oder noch schwieriger) werden, mit ihm zu interagieren. Aber Ihre gemessene Antwort auf meine "die akzeptierte Antwort ist FALSCH " hat mich dazu inspiriert, mein Intro abzuschwächen , und sollte anderen hier als Beispiel dienen, wie man richtig und produktiv kommuniziert 😺.
Solomon Rutzky
4
Gern geschehen und schön zu hören, dass ich irgendwie einen positiven Einfluss hatte, aber ich genieße es, "falsch" zu sein. Es eröffnet Möglichkeiten, neue Dinge zu lernen, was großartig ist!
Kris
24

Der CP1 bedeutet "Codepage 1" - technisch bedeutet dies Codepage 1252

Chris Halcrow
quelle
16

Das Schlüsselwort COLLATE gibt an , welche Art von Zeichensatz und Regeln (Reihenfolge, Konfrontationsregeln) Sie für Zeichenfolgenwerte verwenden.

In Ihrem Fall verwenden Sie beispielsweise lateinische Regeln mit Groß- und Kleinschreibung ( CI ) und Akzent ( AS ).

Sie können sich auf diese Dokumentation beziehen

il_guru
quelle
9

Dies gibt die Standardkollatierung für die Datenbank an. Jedes Textfeld, das Sie in Tabellen in der Datenbank erstellen, verwendet diese Sortierung, sofern Sie keine andere angeben.

Eine Datenbank hat immer eine Standardkollatierung. Wenn Sie keine angeben, wird die Standardkollatierung der SQL Server-Instanz verwendet.

Der Name der von Ihnen verwendeten Kollatierung zeigt an, dass die Latin1-Codepage 1 verwendet wird. Dabei wird die Groß- und Kleinschreibung nicht berücksichtigt (CI) und die Akzentgröße wird nicht berücksichtigt (AS). Diese Sortierung wird in den USA verwendet und enthält daher Sortierregeln, die in den USA verwendet werden.

Die Sortierung entscheidet, wie Textwerte auf Gleichheit und Ähnlichkeit verglichen werden und wie sie beim Sortieren verglichen werden. Die Codepage wird zum Speichern von Nicht-Unicode-Daten verwendet, z. B. Varchar-Feldern.

Guffa
quelle
falsch (Sie können keine notSortierung angeben, obwohl Sie die Standardeinstellung akzeptieren können) falsch (wird auch für Unicode-Daten verwendet)
RichardTheKiwi
@Richard aka cyberkiwi: Überprüfen Sie die Dokumentation: msdn.microsoft.com/en-us/library/ms176061.aspx Die Angabe der Sortierung ist optional. Die Codepage wird nicht zum Speichern von Unicode-Daten verwendet, da diese als 16-Bit-Unicode-Codepunkte und nicht als 8-Bit-Codepage-Indizes gespeichert werden.
Guffa
Ich habe Ihre Antwort falsch gelesen, aber sie ist immer noch falsch. Eine Datenbank hat immer eine Standardkollatierung = SERVER-Kollatierung , nicht speziell Latin1_General_CI_AS. Jetzt habe ich es falsch gelesen, weil ich zur Hälfte damit gerechnet habe, dass es sich bei der Aussage um eine SERVER-Kollatierung handelt, die die Annahme eines Standardwerts in der Benutzeroberfläche erfordert. Für den zweiten Punkt scheinen Sie zu implizieren, dass die Sortierung nicht zum Sortieren von Unicode-Daten verwendet wird (obwohl Sie in den letzten beiden Sätzen von sortingzu wechseln storing). Unicode-Textdaten gehorchen auch Kollatierungen.
RichardTheKiwi
@Richard aka cyberkiwi: Ich habe den Absatz über die Standardkollatierung so geändert, dass er der spezifischen Dokumentation entspricht, mit der ich verlinkt habe. (Es unterscheidet sich je nach Serverversion.) In Bezug auf den zweiten Punkt kann ich nicht sehen, wie ich es klarer machen könnte. Der Text besagt, dass die Codepage beim Speichern von Nicht-Unicode-Daten verwendet wird. Eine Codepage wird weder für Unicode-Daten noch für Nicht-Unicode-Daten zur Bestimmung der Sortierung verwendet.
Guffa