Enthaltene DatenbanksortierungenContained Database Collations

Dieses Thema gilt für: JaSQL ServerkeineAzure SQL-DatenbankkeineAzure SQL Data Warehouse keine Parallel DatawarehouseTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Auf die Sortierreihenfolge und die Gleichheitssemantik von Textdaten wirken sich verschiedene Eigenschaften aus, u. a. die Berücksichtigung der Groß- und Kleinschreibung, die Berücksichtigung von Akzenten sowie die verwendete Basissprache.Various properties affect the sort order and equality semantics of textual data, including case sensitivity, accent sensitivity, and the base language being used. Diese Eigenschaften werden für SQL ServerSQL Server durch die ausgewählte Sortierung der Daten ausgedrückt.These qualities are expressed to SQL ServerSQL Server through the choice of collation for the data. Eine ausführliche Erläuterung zu Sortierungen finden Sie unter Sortierung und Unicode-Unterstützung.For a more in-depth discussion of collations themselves, see Collation and Unicode Support.

Sortierungen gelten nicht nur für in Benutzertabellen gespeicherte Daten, sondern für jeden von SQL ServerSQL Server behandelten Text, einschließlich Metadaten, temporäre Objekte, Variablennamen usw. Deren Behandlung variiert in eigenständigen und abhängigen DatenbankenCollations apply not only to data stored in user tables, but to all text handled by SQL ServerSQL Server, including metadata, temporary objects, variable names, etc. The handling of these differs in contained and non-contained databases. Diese Änderung wirkt sich nicht auf viele Benutzer aus. Stattdessen trägt sie zu Unabhängigkeit von Instanzen und Einheitlichkeit bei.This change will not affect many users, but helps provide instance independence and uniformity. Dies verursacht jedoch möglicherweise auch etwas Verwirrung sowie Probleme bei Sitzungen, in denen sowohl auf enthaltene als auch auf nicht enthaltene Datenbanken zugegriffen wird.But this may also cause some confusion, as well as problems for sessions that access both contained and non-contained databases.

In diesem Thema wird das Wesen der Änderung erläutert. Zudem werden einige Bereiche beschrieben, in denen sie möglicherweise Probleme verursacht.This topic clarifies the content of the change, and examines areas where the change may cause problems.

Abhängige DatenbankenNon-Contained Databases

Alle Datenbanken weisen eine Standardsortierung auf, die beim Erstellen oder Ändern einer Datenbank festgelegt werden kann.All databases have a default collation (which can be set when creating or altering a database. Diese Sortierung wird für sämtliche Metadaten in der Datenbank sowie als Standard für alle Zeichenfolgenspalten in der Datenbank verwendet.This collation is used for all metadata in the database, as well as the default for all string columns within the database. Benutzer können mit der COLLATE -Klausel für jede einzelne Spalte eine andere Sortierung auswählen.Users can choose a different collation for any particular column by using the COLLATE clause.

Beispiel 1Example 1

Wenn Sie z. B. in Peking arbeiten, kann eine chinesische Sortierung verwendet werden:For example, if we were working in Beijing, we might use a Chinese collation:

ALTER DATABASE MyDB COLLATE Chinese_Simplified_Pinyin_100_CI_AS;  

Wenn nun eine Spalte erstellt wird, ist deren Standardsortierung diese chinesische Sortierung. Gegebenenfalls kann jedoch eine andere Sortierung ausgewählt werden:Now if we create a column, its default collation will be this Chinese collation, but we can choose another one if we want:

CREATE TABLE MyTable  
      (mycolumn1 nvarchar,  
      mycolumn2 nvarchar COLLATE Frisian_100_CS_AS);  
GO  
SELECT name, collation_name  
FROM sys.columns  
WHERE name LIKE 'mycolumn%' ;  
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

name            collation_name  
--------------- ----------------------------------  
mycolumn1       Chinese_Simplified_Pinyin_100_CI_AS  
mycolumn2       Frisian_100_CS_AS  

Dies erscheint relativ einfach, es treten jedoch mehrere Probleme auf.This appears relatively simple, but several problems arise. Da die Sortierung für eine Spalte von der Datenbank abhängt, in der die Tabelle erstellt wurde, treten Probleme mit der Verwendung von temporären Tabellen auf, die in tempdb gespeichert werden.Because the collation for a column is dependent on the database in which the table is created, problems arise with the use of temporary tables which are stored in tempdb. Die Sortierung von tempdb entspricht normalerweise der Sortierung für die Instanz. Diese muss nicht unbedingt der Datenbanksortierung entsprechen.The collation of tempdb usually matches the collation for the instance, which does not have to match the database collation.

Beispiel 2Example 2

Betrachten Sie beispielsweise die obige (chinesische) Datenbank, wenn diese in einer Instanz mit der Sortierung Latin1_General verwendet wird:For example, consider the (Chinese) database above when used on an instance with a Latin1_General collation:

CREATE TABLE T1 (T1_txt nvarchar(max)) ;  
GO  
CREATE TABLE #T2 (T2_txt nvarchar(max)) ;  
GO  

Auf den ersten Blick weisen diese beiden Tabellen dasselbe Schema auf. Da sich aber die Sortierungen der Datenbanken unterscheiden, sind die Werte tatsächlich nicht kompatibel:At first glance, these two tables look like they have the same schema, but since the collations of the databases differ, the values are actually incompatible:

SELECT T1_txt, T2_txt  
FROM T1   
JOIN #T2   
    ON T1.T1_txt = #T2.T2_txt  

Im Folgenden finden Sie das Resultset.Here is the result set.

Meldung 468, Ebene 16, Status 9, Zeile 2Msg 468, Level 16, State 9, Line 2

Ein Sortierungskonflikt zwischen "Latin1_General_100_CI_AS_KS_WS_SC" und "Chinese_Simplified_Pinyin_100_CI_AS" im Equal To-Vorgang kann nicht aufgelöst werden.Cannot resolve the collation conflict between "Latin1_General_100_CI_AS_KS_WS_SC" and Chinese_Simplified_Pinyin_100_CI_AS" in the equal to operation.

Dies kann durch das explizite Sortieren der temporären Tabelle korrigiert werden.We can fix this by explicitly collating the temporary table. SQL ServerSQL Server erleichtert diesen Vorgang etwas, indem das DATABASE_DEFAULT -Schlüsselwort für die COLLATE -Klausel bereitgestellt wird. makes this somewhat easier by providing the DATABASE_DEFAULT keyword for the COLLATE clause.

CREATE TABLE T1 (T1_txt nvarchar(max)) ;  
GO  
CREATE TABLE #T2 (T2_txt nvarchar(max) COLLATE DATABASE_DEFAULT);  
GO  
SELECT T1_txt, T2_txt  
FROM T1   
JOIN #T2   
    ON T1.T1_txt = #T2.T2_txt ;  

Die Ausführung erfolgt nun ohne Fehler.This now runs without error.

Das sortierungsabhängige Verhalten ist auch bei Variablen zu beobachten.We can also see collation-dependent behavior with variables. Betrachten Sie die folgende Funktion:Consider the following function:

CREATE FUNCTION f(@x INT) RETURNS INT  
AS BEGIN   
      DECLARE @I INT = 1  
      DECLARE @İ INT = 2  
      RETURN @x * @i  
END;  

Dies ist eine relativ spezielle Funktion.This is a rather peculiar function. In einer Sortierung mit Berücksichtigung der Groß-/Kleinschreibung kann für das @i in der Rückgabeklausel keine Bindung an @I oder @İ hergestellt werden.In a case-sensitive collation, the @i in the return clause cannot bind to either @I or @İ. Bei der Sortierung „Latin1_General“ ohne Berücksichtigung der Groß-/Kleinschreibung wird @i an @I gebunden, und die Funktion gibt 1 zurück.In a case-insensitive Latin1_General collation, @i binds to @I, and the function returns 1. Bei der Sortierung „Turkish“ ohne Berücksichtigung der Groß-/Kleinschreibung wird jedoch @i an @İ gebunden, und die Funktion gibt 2 zurück.But in a case-insensitive Turkish collation, @i binds to @İ, and the function returns 2. Dies kann erhebliche Beschädigungen in einer Datenbank verursachen, bei der zwischen Instanzen mit unterschiedlichen Sortierungen gewechselt wird.This can wreak havoc on a database that moves between instances with different collations.

Eigenständige DatenbankenContained Databases

Da eines der Entwurfsziele bei eigenständigen Datenbanken darin besteht, diese in sich abgeschlossen einzurichten, muss die Abhängigkeit von Instanzen und tempdb -Sortierungen abgetrennt werden.Since a design objective of contained databases is to make them self-contained, the dependence on the instance and tempdb collations must be severed. Hierzu wurde für eigenständige Datenbanken das Konzept der Katalogsortierung eingeführt.To do this, contained databases introduce the concept of the catalog collation. Die Katalogsortierung wird für Systemmetadaten und vorübergehende Objekte verwendet.The catalog collation is used for system metadata and transient objects. Einzelheiten hierzu finden Sie weiter unten.Details are provided below.

In einer eigenständigen Datenbank ist die Katalogsortierung Latin1_General_100_CI_AS_WS_KS_SC.In a contained database, the catalog collation Latin1_General_100_CI_AS_WS_KS_SC. Diese Sortierung ist für alle eigenständigen Datenbanken in allen Instanzen von SQL ServerSQL Server identisch und kann nicht geändert werden.This collation is the same for all contained databases on all instances of SQL ServerSQL Server and cannot be changed.

Die Datenbanksortierung wird beibehalten, sie wird jedoch nur für Benutzerdaten als Standardsortierung verwendet.The database collation is retained, but is only used as the default collation for user data. Standardmäßig entspricht die Datenbanksortierung der model-Datenbanksortierung, sie kann jedoch vom Benutzer wie bei abhängigen Datenbanken durch einen CREATE - oder ALTER DATABASE -Befehl geändert werden.By default, the database collation is equal to the model database collation, but can be changed by the user through a CREATE or ALTER DATABASE command as with non-contained databases.

Ein neues Schlüsselwort, CATALOG_DEFAULT, steht in den COLLATE -Klausel zur Verfügung.A new keyword, CATALOG_DEFAULT, is available in the COLLATE clause. Diese wird als Verknüpfung zur aktuellen Sortierung der Metadaten in enthaltenen und nicht enthaltenen Datenbanken verwendet.This is used as a shortcut to the current collation of metadata in both contained and non-contained databases. Das heißt, in einer nicht enthaltenen Datenbank gibt CATALOG_DEFAULT die aktuelle Datenbanksortierung zurück, da Metadaten in der Datenbanksortierung sortiert werden.That is, in a non-contained database, CATALOG_DEFAULT will return the current database collation, since metadata is collated in the database collation. In einer enthaltenen Datenbank können sich diese zwei Werte unterscheiden, da der Benutzer die Datenbanksortierung ändern kann, sodass sie von der Katalogsortierung abweicht.In a contained database, these two values may be different, since the user can change the database collation so that it does not match the catalog collation.

Das Verhalten verschiedener Objekte in nicht enthaltenen und enthaltenen Datenbanken wird in dieser Tabelle zusammengefasst:The behavior of various objects in both non-contained and contained databases is summarized in this table:

ElementItem Nicht enthaltene DatenbankNon-Contained Database Enthaltene DatenbankContained Database
Benutzerdaten (Standard)User Data (default) DATABASE_DEFAULTDATABASE_DEFAULT DATABASE_DEFAULTDATABASE_DEFAULT
Temp-Daten (Standard)Temp Data (default) TempDB-SortierungTempDB Collation DATABASE_DEFAULTDATABASE_DEFAULT
MetadatenMetadata DATABASE_DEFAULT/CATALOG_DEFAULTDATABASE_DEFAULT / CATALOG_DEFAULT CATALOG_DEFAULTCATALOG_DEFAULT
Temporäre MetadatenTemporary Metadata TempDB-Sortierungtempdb Collation CATALOG_DEFAULTCATALOG_DEFAULT
VariablenVariables InstanzsortierungInstance Collation CATALOG_DEFAULTCATALOG_DEFAULT
Goto-BezeichnungenGoto Labels InstanzsortierungInstance Collation CATALOG_DEFAULTCATALOG_DEFAULT
CursornamenCursor Names InstanzsortierungInstance Collation CATALOG_DEFAULTCATALOG_DEFAULT

Im zuvor beschriebenen Beispiel für eine temporäre Tabelle ist ersichtlich, dass dieses Sortierverhalten bei den meisten Verwendungen temporärer Tabellen eine explizite COLLATE -Klausel überflüssig macht.If we temp table example previously described, we can see that this collation behavior eliminates the need for an explicit COLLATE clause in most temp table uses. In einer enthaltenen Datenbank wird dieser Code nun ohne Fehler ausgeführt, selbst wenn sich die Datenbanksortierung und die Instanzsortierung unterscheiden:In a contained database, this code now runs without error, even if the database and instance collations differ:

CREATE TABLE T1 (T1_txt nvarchar(max)) ;  
GO  
CREATE TABLE #T2 (T2_txt nvarchar(max));  
GO  
SELECT T1_txt, T2_txt  
FROM T1   
JOIN #T2   
    ON T1.T1_txt = #T2.T2_txt ;  

Dies funktioniert, da sowohl T1_txt als auch T2_txt in der Datenbanksortierung der enthaltenen Datenbank sortiert werden.This works because both T1_txt and T2_txt are collated in the database collation of the contained database.

Wechseln zwischen einem enthaltenen und einem nicht enthaltenen KontextCrossing Between Contained and Uncontained Contexts

Solange sich eine Sitzung auf eine enthaltene Datenbank beschränkt, darf die Datenbank nicht verlassen werden, mit der eine Verbindung besteht.As long as a session in a contained database remains contained, it must remain within the database to which it connected. In diesem Fall ist das Verhalten sehr einfach.In this case the behavior is very straightforward. Wenn jedoch in einer Sitzung zwischen einem enthaltenen und einem nicht enthaltenen Kontext gewechselt wird, ist das Verhalten komplexer, da die beiden Regelsätze überbrückt werden müssen.But if a session crosses between contained and non-contained contexts, the behavior becomes more complex, since the two sets of rules must be bridged. Dies kann in einer teilweise enthaltenen Datenbank der Fall sein, da ein Benutzer mit USE auf eine andere Datenbank zugreifen kann.This can happen in a partially-contained database, since a user may USE to another database. In diesem Fall werden die Unterschiede zwischen den Sortierungsregeln gemäß dem folgenden Prinzip behandelt.In this case, the difference in collation rules is handled by the following principle.

  • Das Sortierungsverhalten für einen Batch wird von der Datenbank bestimmt, in der der Batch beginnt.The collation behavior for a batch is determined by the database in which the batch begins.

    Beachten Sie, dass diese Entscheidung getroffen wird, bevor Befehle ausgegeben werden (auch der anfängliche USE-Befehl).Note that this decision is made before any commands are issued, including an initial USE. Das heißt, wenn ein Batch in einer eigenständigen Datenbank beginnt, der erste Befehl jedoch ein USE -Befehl für eine abhängige Datenbank ist, wird dennoch das Sortierungsverhalten der eigenständigen Datenbank für den Batch verwendet.That is, if a batch begins in a contained database, but the first command is a USE to a non-contained database, the contained collation behavior will still be used for the batch. Angesichts dessen kann beispielsweise ein Verweis auf eine Variable mehrere mögliche Ergebnisse haben:Given this, a reference to a variable, for example, may have multiple possible outcomes:

  • Durch den Verweis kann genau eine Übereinstimmung gefunden werden.The reference may find exactly one match. In diesem Fall funktioniert der Verweis ohne Fehler.In this case, the reference will work without error.

  • Durch den Verweis wird möglicherweise keine Übereinstimmung in der aktuellen Sortierung gefunden, obwohl zuvor eine vorhanden war.The reference may not find a match in the current collation where there was one before. Dadurch wird ein Fehler ausgelöst, der angibt, dass die Variable nicht vorhanden ist, auch wenn diese offensichtlich erstellt wurde.This will raise an error indicating that the variable does not exist, even though it was apparently created.

  • Durch den Verweis können mehrere Übereinstimmungen gefunden werden, die sich ursprünglich voneinander unterschieden haben.The reference may find multiple matches that were originally distinct. Auch hierdurch wird ein Fehler ausgelöst.This will also raise an error.

    Dies wird im Folgenden anhand einiger Beispiele veranschaulicht.We’ll illustrate this with a few examples. Dabei wird angenommen, dass eine teilweise eigenständige Datenbank mit dem Namen MyCDB vorhanden ist, deren Datenbanksortierung auf die Standardsortierung Latin1_General_100_CI_AS_WS_KS_SCfestgelegt ist.For these we assume there is a partially-contained database named MyCDB with its database collation set to the default collation, Latin1_General_100_CI_AS_WS_KS_SC. Wir nehmen an, dass die instanzsortierung Latin1_General_100_CS_AS_WS_KS_SCist.We assume that the instance collation is Latin1_General_100_CS_AS_WS_KS_SC. Die beiden Sortierungen unterscheiden sich nur hinsichtlich der Berücksichtigung der Groß- und Kleinschreibung.The two collations differ only in case sensitivity.

Beispiel 1Example 1

Im folgenden Beispiel wird der Fall veranschaulicht, bei dem durch den Verweis genau eine Übereinstimmung gefunden wird.The following example illustrates the case where the reference finds exactly one match.

USE MyCDB;  
GO  

CREATE TABLE #a(x int);  
INSERT INTO #a VALUES(1);  
GO  

USE master;  
GO  

SELECT * FROM #a;  
GO  

Results:  

Im Folgenden finden Sie das Resultset.Here is the result set.

x  
-----------  
1  

In diesem Fall wird vom erkannten #a eine Bindung sowohl mit der Katalogsortierung ohne Berücksichtigung der Groß- und Kleinschreibung als auch mit der Instanzsortierung mit Berücksichtigung der Groß- und Kleinschreibung hergestellt, und der Code wird fehlerfrei ausgeführt.In this case, the identified #a binds in both the case-insensitive catalog collation and the case-sensitive instance collation, and the code works.

Beispiel 2Example 2

Im folgenden Beispiel wird der Fall veranschaulicht, in dem durch den Verweis keine Übereinstimmung in der aktuellen Sortierung gefunden wird, wo zuvor eine Übereinstimmung vorhanden war.The following example illustrates the case where the reference does not find a match in the current collation where there was one before.

USE MyCDB;  
GO  

CREATE TABLE #a(x int);  
INSERT INTO #A VALUES(1);  
GO  

Hier wird eine Bindung von "#A" an "#a" in der Standardsortierung ohne Berücksichtigung der Groß- und Kleinschreibung hergestellt, und die Einfügung funktioniert.Here, the #A binds to #a in the case-insensitive default collation, and the insert works,

Im Folgenden finden Sie das Resultset.Here is the result set.

(1 row(s) affected)  

Wenn jedoch das Skript fortgesetzt wird...But if we continue the script...

USE master;  
GO  

SELECT * FROM #A;  
GO  

Beim Versuch, eine Bindung an #A in der Instanzsortierung mit Berücksichtigung der Groß- und Kleinschreibung herzustellen, wird ein Fehler ausgegeben:We get an error trying to bind to #A in the case-sensitive instance collation;

Im Folgenden finden Sie das Resultset.Here is the result set.

Meldung 208, Ebene 16, Status 0, Zeile 2Msg 208, Level 16, State 0, Line 2

Ungültiger Objektname '#A'.Invalid object name '#A'.

Beispiel 3Example 3

Im folgenden Beispiel wird der Fall veranschaulicht, wo durch den Verweis mehrere Übereinstimmungen gefunden werden, die sich ursprünglich voneinander unterschieden haben.The following example illustrates the case where the reference finds multiple matches that were originally distinct. Zunächst wird in tempdb begonnen (die dieselbe Sortierung mit Berücksichtigung von Groß-/Kleinschreibung aufweist wie die gegebene Instanz), und folgende Anweisungen werden ausgeführt.First, we start in tempdb (which has the same case-sensitive collation as our instance) and execute the following statements.

USE tempdb;  
GO  

CREATE TABLE #a(x int);  
GO  
CREATE TABLE #A(x int);  
GO  
INSERT INTO #a VALUES(1);  
GO  
INSERT INTO #A VALUES(2);  
GO  

Diese Ausführung ist erfolgreich, da die Tabellen in dieser Sortierung eindeutig sind:This succeeds, since the tables are distinct in this collation:

Im Folgenden finden Sie das Resultset.Here is the result set.

(1 row(s) affected)  
(1 row(s) affected)  

Beim Wechseln in die enthaltene Datenbank wird jedoch festgestellt, dass keine Bindungen an diese Tabellen hergestellt werden können.If we move into our contained database, however, we find that we can no longer bind to these tables.

USE MyCDB;  
GO  
SELECT * FROM #a;  
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

Meldung 12800, Ebene 16, Status 1, Zeile 2Msg 12800, Level 16, State 1, Line 2

Der Verweis auf den Namen '#a' der temporären Tabelle ist mehrdeutig und kann nicht aufgelöst werden.The reference to temp table name '#a' is ambiguous and cannot be resolved. Verwenden Sie entweder '#a' oder '#A'.Possible candidates are '#a' and '#A'.

FazitConclusion

Das Sortierungsverhalten enthaltener Datenbanken unterscheidet sich leicht von dem nicht enthaltener Datenbanken.The collation behavior of contained databases differs subtly from that in non-contained databases. Dieses Verhalten ist im Allgemeinen vorteilhaft und trägt zu Unabhängigkeit von Instanzen sowie Einfachheit bei.This behavior is generally beneficial, providing instance-independence and simplicity. Für einige Benutzer können Probleme auftreten, insbesondere dann, wenn in einer Sitzung sowohl auf enthaltene als auch auf nicht enthaltene Datenbanken zugegriffen wird.Some users may have issues, particularly when a session accesses both contained and non-contained databases.

Weitere Informationen finden Sie unterSee Also

Eigenständige DatenbankenContained Databases