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.
sql-server
database
tsql
collation
Donner
quelle
quelle
SQL_Latin1_General_CI_AS
. Insbesondere CP1 hat mich gefragt.SQL_Latin1_General_CI_AS
. Vielmehr gibt es eineLatin1_General_CI_AS
. SieheSELECT * 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/… .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 dieCOLLATE
Klausel vonCREATE DATABASE
?", dann:Die
COLLATE {collation_name}
Klausel derCREATE DATABASE
Anweisung gibt die Standardkollatierung der Datenbank und nicht des Servers an. Standardkollatierungen auf Datenbankebene und Serverebene steuern verschiedene Dinge.Steuerelemente auf Server- (dh Instanz-) Ebene :
master
,model
,msdb
, undtempdb
.tempdb
ist dies dann die Standardkollatierung für Zeichenfolgenspalten in temporären Tabellen (global und lokal), jedoch nicht für Tabellenvariablen.master
, es ist dann die Sortierungs für verwendeten Server-Level - Daten, wie zB Datenbanknamen (dhname
Spaltesys.databases
), Login - Namen, usw.GOTO
EtikettenCOLLATE
Klausel fehltSteuerelemente auf Datenbankebene :
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
, undNTEXT
- aber nicht verwenden ,TEXT
oderNTEXT
) , wenn dieCOLLATE
Klausel aus der Spaltendefinition fehlt. Dies gilt sowohl fürCREATE TABLE
als auch fürALTER TABLE ... ADD
Aussagen.'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.sys.objects
), Spaltennamen (dhsys.columns
), Indexnamen (dhsys.indexes
) usw.Ebenfalls:
Latin1
bedeutet nicht "ASCII", da Standard-ASCII nur die Werte 0 bis 127 abdeckt und alle Codepages (die in SQL Server und sogar dargestellt werden könnenNVARCHAR
) 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 leiderSQL_Latin1_General_CP1_CI_AS
sehr 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 zwischenVARCHAR
undNVARCHAR
fü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.NCHAR
,,NVARCHAR
undNTEXT
Daten bestimmt dies die Sprachregeln, die zum Sortieren und Vergleichen verwendet werden.CHAR
,VARCHAR
undTEXT
Daten (Spalten, Literale und Variablen) bestimmt dies die:Latin1_General
Kollatierungen die Codepage 1252,Hebrew
Kollatierungen die Codepage 1255 usw.CP{code_page}
oder{version}
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 Version80
(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 einige90
(für SQL Server 2005, Version 9.0), die meisten100
(für SQL Server 2008, Version 10.0) und eine kleine Gruppe140
(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 Version90
und100
Sortierungen, beginnen jedoch erst in SQL Server 2012.CS
= Groß- und Kleinschreibung beachten oderCI
= Groß- und Kleinschreibung nicht berücksichtigenAS
= akzentempfindlich oderAI
= akzentunempfindlichKS
= Kana typempfindlich oder fehlt = Kana typunempfindlichWS
= Breitensensitiv oder fehlend = BreitenunempfindlichVSS
= Variationswähler empfindlich (nur in den Kollatierungen der Version 140 verfügbar) oder fehlt = Variationswähler unempfindlichOptionales letztes Stück:
_SC
am 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_SC
am 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._BIN
oder_BIN2
am 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
._BIN
ist der ältere Stil und_BIN2
ist der neuere, genauere Stil. Wenn Sie SQL Server 2005 oder höher verwenden, verwenden Sie_BIN2
. Einzelheiten zu den Unterschieden zwischen_BIN
und_BIN2
finden Sie unter: Unterschiede zwischen den verschiedenen binären Kollatierungen (Kulturen, Versionen und BIN vs BIN2) ._UTF8
ist eine neue Option ab SQL Server 2019. Es handelt sich um eine 8-Bit-Codierung, mit der Unicode-DatenVARCHAR
undCHAR
Datentypen (jedoch nicht der veralteteTEXT
Datentyp) 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_SC
ihrem Namen und Kollatierungen der Version 140). Es gibt auch eine einzelne binäre_UTF8
Kollatierung (_BIN2
nicht_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
NVARCHAR
kann, 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 selbstVARCHAR
Daten (Spalten, Variablen, Zeichenfolgenliterale) mit a verwenden_UTF8
Kollation. 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_UTF8
Kollatierung mitVARCHAR
Daten mischen, die keine Kollatierungen_UTF8
oderNVARCHAR
Daten 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?quelle
COLLATE
Klausel vonCREATE DATABASE
tut. 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)Der CP1 bedeutet "Codepage 1" - technisch bedeutet dies Codepage 1252
quelle
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
quelle
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.
quelle
not
Sortierung angeben, obwohl Sie die Standardeinstellung akzeptieren können) falsch (wird auch für Unicode-Daten verwendet)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 vonsorting
zu wechselnstoring
). Unicode-Textdaten gehorchen auch Kollatierungen.