Wir wechseln von SQL 2005 [Instanz und Datenbank haben Kollatierung von SQL_Latin1_General_CP1_CI_AS
] zu SQL 2008 [die Standardeinstellung ist Latin1_General_CI_AS
].
Ich habe eine SQL 2008 R2-Installation abgeschlossen und die Standardsortierung verwendet Latin1_General_CI_AS
, wobei die Wiederherstellung der Datenbank noch aktiv war SQL_Latin1_General_CP1_CI_AS
. Die ausnahmslos auftretenden Probleme - die #temp-Tabellen, in denen sich die Datenbank Latin1_General_CI_AS
befand, SQL_Latin1_General_CP1_CI_AS
und hier bin ich jetzt - Ich brauche jetzt Ratschläge zu den Fallstricken.
Bei der Installation von SQL 2008 R2, ich habe die Möglichkeit der Installation zu nutzen , 'SQL Collation, used for backwards compatibility'
wo ich die Möglichkeit, die gleiche Sortierung wie die 2005 - Datenbank auszuwählen: SQL_Latin1_General_CP1_CI_AS
.
Dadurch kann ich keine Probleme mit # temporären Tabellen haben, aber gibt es Fallstricke?
Würde ich Funktionen oder Features jeglicher Art verlieren, wenn ich keine "aktuelle" Sortierung von SQL 2008 verwende?
- Was ist, wenn wir (z. B. in 2 Jahren) von 2008 nach SQL 2012 wechseln? Habe ich dann Probleme?
Würde ich irgendwann gezwungen sein, zu gehen
Latin1_General_CI_AS
?Ich habe gelesen, dass ein DBA-Skript die Zeilen mit vollständigen Datenbanken vervollständigt und dann das Einfügeskript mit der neuen Kollatierung in der Datenbank ausführt.
quelle
Antworten:
Zunächst eine Entschuldigung für eine so lange Antwort, da ich das Gefühl habe, dass immer noch viel Verwirrung herrscht, wenn über Begriffe wie Kollatierung, Sortierreihenfolge, Codepage usw. gesprochen wird.
Von BOL :
Dies bedeutet, dass die Sortierung sehr wichtig ist, da sie Regeln für das Sortieren und Vergleichen von Zeichenfolgen der Daten festlegt.
Hinweis: Weitere Informationen zu COLLATIONPROPERTY
Jetzt lasst uns zuerst die Unterschiede verstehen ......
Laufen unter T-SQL:
Die Ergebnisse wären:
Wenn Sie sich die obigen Ergebnisse ansehen, ist der einzige Unterschied die Sortierreihenfolge zwischen den beiden Kollatierungen. Dies ist jedoch nicht der Fall. Hier sehen Sie, warum:
Test 1:
Ergebnisse von Test 1:
Aus den obigen Ergebnissen können wir ersehen, dass wir die Werte von Spalten mit unterschiedlichen Sortierungen nicht direkt vergleichen können. Sie müssen sie
COLLATE
zum Vergleichen der Spaltenwerte verwenden.TEST 2:
Der Hauptunterschied ist die Leistung, wie Erland Sommarskog bei dieser Diskussion über msdn betont .
--- Erstellen Sie Indizes für beide Tabellen
--- Führen Sie die Abfragen aus
--- Dies hat eine IMPLICIT-Konvertierung zur Folge
--- Führen Sie die Abfragen aus
--- Dies wird NICHT haben Implizite Konvertierung
Der Grund für die implizite Konvertierung liegt darin, dass ich meine Datenbank- und Server- Kollatierung sowohl als
SQL_Latin1_General_CP1_CI_AS
als auch in der Tabelle Table_Latin1_General_CI_AS die Spalte Comments definiert habe, wieVARCHAR(50)
bei COLLATE Latin1_General_CI_AS , sodass SQL Server während der Suche eine IMPLICIT-Konvertierung durchführen muss.Test 3:
Mit demselben Setup vergleichen wir jetzt die varchar-Spalten mit den nvarchar-Werten, um die Änderungen in den Ausführungsplänen zu sehen.
- Führen Sie die Abfrage aus
- Führen Sie die Abfrage aus
Beachten Sie, dass die erste Abfrage eine Indexsuche durchführen kann, jedoch eine implizite Konvertierung durchführen muss, während die zweite eine Indexsuche durchführt, die sich in Bezug auf die Leistung als ineffizient erweist, wenn große Tabellen durchsucht werden.
Fazit :
SQL_Latin1_General_CP1_CI_AS
ist eine SQL-Kollatierung mit den Regeln, mit denen Sie Daten nach Unicode und Nicht-Unicode sortieren können.Latin1_General_CI_AS
ist eine Windows-Kollatierung mit den Regeln, mit denen Sie Daten sortieren können, die für Unicode und Nicht-Unicode gleich sind.Siehe meine Antwort oben.
Es hängt alles davon ab, auf welche Funktionen Sie sich beziehen. Beim Sortieren werden Daten gespeichert und sortiert.
Kann nicht gutheißen! Da sich die Dinge ändern können und es immer gut ist, den Vorschlägen von Microsoft zu folgen, müssen Sie Ihre Daten und die oben erwähnten Fallstricke verstehen. Beachten Sie auch diese und diese Verbindungselemente.
Wenn Sie die Sortierung ändern möchten, sind solche Skripte hilfreich. Ich habe festgestellt, dass ich die Kollatierung von Datenbanken oft an die Kollatierung von Servern angeglichen habe, und ich habe einige Skripte, die das ziemlich ordentlich machen. Lass es mich wissen, wenn du es brauchst.
Verweise :
quelle
Zusätzlich zu dem, was @Kin in seiner Antwort ausführlich darlegt , gibt es noch ein paar Dinge zu beachten, die beim Wechseln der Standardkollatierung des Servers (dh der Instanz) zu beachten sind (Elemente über der horizontalen Linie sind direkt relevant für die beiden in der Frage genannten Kollatierungen; Elemente unterhalb der waagerechten Linie sind für das Allgemeine relevant):
WENN DIE STANDARDKOLLATION IHRER DATENBANK NICHT ÄNDERT, sollte das in @ Kins Antwort beschriebene Leistungsproblem der "impliziten Konvertierung" kein Problem sein, da Zeichenfolgenliterale und lokale Variablen die Standardkollation der Datenbank verwenden, nicht die des Servers. Die einzigen Auswirkungen für das Szenario, in dem die Kollatierung auf Instanzebene geändert wird, jedoch nicht die Kollatierung auf Datenbankebene (beide werden nachstehend ausführlich beschrieben):
Ein Unterschied zwischen diesen beiden Sortierungen besteht darin, wie sie bestimmte Zeichen für
VARCHAR
Daten sortieren (dies wirkt sich nicht aufNVARCHAR
Daten aus). Die Nicht-EBCDIC-SQL_
Kollatierungen verwenden die so genannte "Zeichenfolgensortierung" fürVARCHAR
Daten, während alle anderen Kollatierungen und sogarNVARCHAR
Daten für die Nicht-EBCDIC-SQL_
Kollatierungen die so genannte "Wortsortierung" verwenden. Der Unterschied besteht darin, dass bei "Wortsortierung" Bindestrich-
und Apostroph'
(und möglicherweise auch einige andere Zeichen?) Eine sehr geringe Gewichtung haben und im Wesentlichen ignoriert werden, sofern keine anderen Unterschiede in den Zeichenfolgen bestehen. Führen Sie Folgendes aus, um dieses Verhalten in Aktion zu sehen:Kehrt zurück:
und:
Während Sie das "String Sort" -Verhalten "verlieren", bin ich mir nicht sicher, ob ich das als "Feature" bezeichnen würde. Es ist ein Verhalten, das als unerwünscht eingestuft wurde (was durch die Tatsache belegt wird, dass es in keiner der Windows-Kollatierungen vorgezogen wurde). Es ist jedoch ein deutlicher Unterschied im Verhalten zwischen den beiden Kollatierungen (ebenfalls nur für Nicht-EBCDIC-
VARCHAR
Daten), und Sie haben möglicherweise Code- und / oder Kundenerwartungen, die auf dem Verhalten "String-Sortierung" basieren. Dazu muss der Code getestet und möglicherweise untersucht werden, ob sich diese Verhaltensänderung negativ auf die Benutzer auswirkt.Ein weiterer Unterschied zwischen
SQL_Latin1_General_CP1_CI_AS
undLatin1_General_100_CI_AS
ist die Fähigkeit zu tun , Expansionen aufVARCHAR
Daten (NVARCHAR
Daten können bereits diese tun für die meistenSQL_
Sortierungen), wie Handhabung ,æ
als wäre esae
:Kehrt zurück:
Das Einzige, was Sie hier "verlieren", ist , dass Sie diese Erweiterungen nicht durchführen können. Im Allgemeinen ist dies ein weiterer Vorteil des Wechsels zu einer Windows-Kollatierung. Genau wie bei der Verschiebung von "String-Sortierung" zu "Wort-Sortierung" gilt jedoch die gleiche Vorsicht: Es handelt sich eindeutig um einen Unterschied zwischen den beiden Sortierungen (wiederum nur für
VARCHAR
Daten), und Sie haben möglicherweise Code und / oder Kunden Erwartungen , basierend auf nicht diese Zuordnungen haben. Dazu muss der Code getestet und möglicherweise untersucht werden, ob sich diese Verhaltensänderung negativ auf die Benutzer auswirkt.(Zuerst in dieser SO-Antwort von @Zarepheth vermerkt: Kann SQL Server SQL_Latin1_General_CP1_CI_AS sicher in Latin1_General_CI_AS konvertiert werden? )
Die Sortierung auf Serverebene wird verwendet, um die Sortierung der Systemdatenbanken festzulegen, einschließlich
[model]
. Die[model]
Datenbank wird als Vorlage zum Erstellen neuer Datenbanken verwendet, die[tempdb]
bei jedem Serverstart erstellt werden. Aber selbst bei einer Änderung der Sortierung auf Serverebene, die die Sortierung von ändert[tempdb]
, gibt es eine einfache Möglichkeit, Sortierungsunterschiede zwischen der Datenbank, die "aktuell" ist, wenn sieCREATE #TempTable
ausgeführt wird, und zu korrigieren[tempdb]
. Deklarieren Sie beim Erstellen temporärer Tabellen eine Kollatierung mit derCOLLATE
Klausel und geben Sie eine Kollatierung an mitDATABASE_DEFAULT
:Es ist am besten, die neueste Version der gewünschten Kollatierung zu verwenden, wenn mehrere Versionen verfügbar sind. Ab SQL Server 2005 wurde eine "90" -Serie von Kollatierungen eingeführt, und SQL Server 2008 führte eine "100" -Serie von Kollatierungen ein. Sie können diese Kollatierungen mithilfe der folgenden Abfragen finden:
Da Sie mit SQL Server 2008 R2 arbeiten, sollten Sie
Latin1_General_100_CI_AS
anstelle von verwendenLatin1_General_CI_AS
.Ein Unterschied zwischen den Groß- und Kleinschreibung betreffenden Versionen dieser bestimmten Kollatierungen (dh
SQL_Latin1_General_CP1_CS_AS
undLatin1_General_100_CS_AS
) liegt in der Reihenfolge von Groß- und Kleinschreibung bei der Sortierung nach Groß- und Kleinschreibung. Dies betrifft auch einzelne Zeichenklassenbereiche (dh[start-end]
), die mit demLIKE
Operator und derPATINDEX
Funktion verwendet werden können. Die folgenden drei Abfragen zeigen diesen Effekt sowohl für die Sortierung als auch für den Zeichenbereich:Die einzige Möglichkeit, Großbuchstaben vor Kleinbuchstaben zu sortieren (für denselben Buchstaben), besteht darin, eine der 31 Kollatierungen zu verwenden, die dieses Verhalten unterstützen, nämlich die
Hungarian_Technical_*
Kollatierungen und eine HandvollSQL_
Kollatierungen (die dieses Verhalten nur fürVARCHAR
Daten unterstützen) ).Weniger wichtig für diese spezielle Änderung, aber dennoch gut zu wissen, da dies Auswirkungen haben würde, wenn der Server auf eine binäre oder case-sensitive Sortierung umgestellt würde, ist, dass die Sortierung auf Serverebene sich auch auf Folgendes auswirkt:
sysname
DatentypsDas heißt, wenn Sie oder "der Programmierer, der vor kurzem gegangen ist", der anscheinend für den ganzen schlechten Code verantwortlich ist ;-), sich nicht um die Groß- und Kleinschreibung gekümmert haben und eine Variable als deklariert,
@SomethingID
aber später darauf verwiesen@somethingId
haben, würde dies beim Umzug in eine Groß- und Kleinschreibung scheitern -sensitive oder binäre Kollation. In ähnlicher Weise wird Code, der densysname
Datentyp verwendet, ihn aber alsSYSNAME
,SysName
oder etwas anderes als Kleinbuchstaben bezeichnet, ebenfalls unterbrochen, wenn er unter Verwendung von Groß- / Kleinschreibung oder binärer Sortierung in eine Instanz verschoben wird.quelle