Welche Zeichenkodierung ist standardmäßig für eine Datenbank in Microsoft SQL Server eingestellt?
Wie kann ich die aktuelle Zeichenkodierung in SQL Server sehen?
Welche Zeichenkodierung ist standardmäßig für eine Datenbank in Microsoft SQL Server eingestellt?
Wie kann ich die aktuelle Zeichenkodierung in SQL Server sehen?
In den meisten Fällen speichert SQL Server Unicode-Daten (d. h. Daten, die in der XML
y N
-vordefinierten Typen) in UCS-2 / UTF-16 (die Speicherung ist die gleiche, UTF-16 behandelt lediglich die Zusatzzeichen korrekt). Dies ist nicht konfigurierbar: Es gibt keine Option zur Verwendung von entweder UTF-8 oder UTF-32 (siehe UPDATE Abschnitt am Ende: UTF-8 ab SQL Server 2019) . Ob die eingebauten Funktionen Zusatzzeichen richtig verarbeiten können und ob diese richtig sortiert und verglichen werden, hängt von der verwendeten Kollation ab. Die älteren Collations - Namen, die mit SQL_
(z.B.. SQL_Latin1_General_CP1_CI_AS
) xoder keine Versionsnummer im Namen (z.B. Latin1_General_CI_AS
) - alle Zusatzzeichen einander gleichsetzen (da sie kein Sortiergewicht haben). Ab SQL Server 2005 wurde die Funktion 90
Serie Collations (die mit _90_
im Namen), die zumindest einen binären Vergleich für Zusatzzeichen durchführen kann, so dass man zwischen ihnen unterscheiden kann, auch wenn sie nicht in der gewünschten Reihenfolge sortiert sind. Das gilt auch für die 100
Serie Collations, eingeführt in SQL Server 2008. SQL Server 2012 führte Collations mit Namen ein, die auf _SC
die nicht nur Ergänzungszeichen richtig sortieren, sondern es auch den eingebauten Funktionen ermöglichen, sie wie erwartet zu interpretieren (d. h. das Surrogatpaar als eine einzige Einheit zu behandeln). Ab SQL Server 2017 werden alle neuen Collations (die 140
Serien) implizite Unterstützung von ergänzenden Zeichen Daher gibt es keine neuen Zusammenstellungen mit Namen, die auf _SC
.
Ab SQL Server 2019 wird UTF-8 eine unterstützte Kodierung für CHAR
y VARCHAR
Daten (Spalten, Variablen und Literale), aber nicht TEXT
(siehe UPDATE Abschnitt am Ende: UTF-8 ab SQL Server 2019) .
Nicht-Unicode-Daten (d. h. Daten, die in der CHAR
, VARCHAR
y TEXT
Typen - aber verwenden Sie nicht TEXT
verwenden VARCHAR(MAX)
stattdessen) verwendet eine 8-Bit-Kodierung (Extended ASCII, DBCS oder EBCDIC). Der spezifische Zeichensatz / die Kodierung basiert auf der Code Page, die wiederum auf der Kollation einer Spalte oder der Kollation der aktuellen Datenbank für Literale und Variablen oder der Kollation der Instanz für Variablen-/Cursornamen und GOTO
Etiketten, oder was in einem COLLATE
Klausel, wenn eine solche verwendet wird.
Um zu sehen, wie Gebietsschemata mit Kollationen übereinstimmen, sehen Sie sich das an:
Um die mit einer bestimmten Sortierung verbundene Codepage zu sehen (dies ist der Zeichensatz und betrifft nur CHAR
/ VARCHAR
/ TEXT
Daten), führen Sie Folgendes aus:
SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'CodePage' ) AS [CodePage];
Um die LCID (d.h. das Gebietsschema) zu sehen, die mit einer bestimmten Kollation verbunden ist (dies wirkt sich auf die Sortier- und Vergleichsregeln aus), führen Sie Folgendes aus:
SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID];
Führen Sie den Befehl aus, um die Liste der verfügbaren Zusammenstellungen mit den zugehörigen LCIDs und Codepages anzuzeigen:
SELECT [name],
COLLATIONPROPERTY( [name], 'LCID' ) AS [LCID],
COLLATIONPROPERTY( [name], 'CodePage' ) AS [CodePage]
FROM sys.fn_helpcollations()
ORDER BY [name];
Bevor man sich mit den Server- und Datenbank-Standard-Collations befasst, sollte man die relative Bedeutung dieser Standardeinstellungen verstehen.
Die Standard-Kollation des Servers (eigentlich der Instanz) wird als Standard für neu erstellte Datenbanken (einschließlich der Systemdatenbanken) verwendet: master
, model
, msdb
y tempdb
). Dies bedeutet jedoch nicht, dass irgendeine Datenbank (außer den 4 System-DBs) diese Sortierung verwendet. Die Standard-Collation der Datenbank kann jederzeit geändert werden (obwohl es Abhängigkeiten gibt, die verhindern können, dass die Collation einer Datenbank geändert wird). Die Standard-Kollation des Servers ist jedoch nicht so einfach zu ändern. Einzelheiten zum Ändern aller Sortierreihenfolgen finden Sie unter: Ändern der Sortierung der Instanz, der Datenbanken und aller Spalten in allen Benutzerdatenbanken: Was kann schon schiefgehen?
Die Server/Instanz Kollation steuert:
CURSOR
NamenGOTO
EtikettenDie Standard-Sortierung der Datenbank wird auf drei Arten verwendet:
IF (@InputParam = 'something')
). Hier ist es wichtig, die Datenbankvorgaben zu kennen, da sie das Verhalten dieser Operationen bestimmen.Die Spalte Collation wird entweder im Feld COLLATE
Klausel zum Zeitpunkt der CREATE TABLE
oder ein ALTER TABLE {table_name} ALTER COLUMN
oder, falls nicht angegeben, aus der Datenbankvorgabe übernommen.
Da es hier mehrere Ebenen gibt, auf denen eine Sortierung angegeben werden kann (Datenbankstandard / Spalten / Literale & Variablen), wird die resultierende Sortierung bestimmt durch Sortierreihenfolge Vorrang .
Die folgende Abfrage zeigt die Standard- bzw. aktuellen Einstellungen für das Betriebssystem, die SQL Server-Instanz und die angegebene Datenbank an:
SELECT os_language_version,
---
SERVERPROPERTY('LCID') AS 'Instance-LCID',
SERVERPROPERTY('Collation') AS 'Instance-Collation',
SERVERPROPERTY('ComparisonStyle') AS 'Instance-ComparisonStyle',
SERVERPROPERTY('SqlSortOrder') AS 'Instance-SqlSortOrder',
SERVERPROPERTY('SqlSortOrderName') AS 'Instance-SqlSortOrderName',
SERVERPROPERTY('SqlCharSet') AS 'Instance-SqlCharSet',
SERVERPROPERTY('SqlCharSetName') AS 'Instance-SqlCharSetName',
---
DATABASEPROPERTYEX(N'{database_name}', 'LCID') AS 'Database-LCID',
DATABASEPROPERTYEX(N'{database_name}', 'Collation') AS 'Database-Collation',
DATABASEPROPERTYEX(N'{database_name}', 'ComparisonStyle') AS 'Database-ComparisonStyle',
DATABASEPROPERTYEX(N'{database_name}', 'SQLSortOrder') AS 'Database-SQLSortOrder'
FROM sys.dm_os_windows_info;
Eine andere Interpretation von "Standard" könnte bedeuten, welche Standard-Kollation für die Instanz-Ebene Zusammenstellung bei der Installation. Das hängt von der Sprache des Betriebssystems ab, aber die (schreckliche, schreckliche) Standardeinstellung für Systeme mit "US-Englisch" ist SQL_Latin1_General_CP1_CI_AS
. In diesem Fall ist die "Standard"-Kodierung Windows Code Page 1252 für VARCHAR
Daten und, wie immer, UTF-16 für NVARCHAR
Daten. Eine Liste der Betriebssystemsprachen, die mit der Standard-SQL-Server-Kollationierung übereinstimmen, finden Sie hier: Kollationierung und Unicode-Unterstützung: Sortierungen auf Serverebene . Denken Sie daran, dass diese Standardeinstellungen überschrieben werden können; diese Liste ist lediglich das, was die Instanz verwenden wird, wenn sie nicht während der Installation überschrieben wird.
UPDATE 2018-10-02
SQL Server 2019 führt die native Unterstützung für UTF-8 in VARCHAR
/ CHAR
Datentypen (nicht TEXT
!). Dies wird durch eine Reihe neuer Kollationen erreicht, deren Namen alle auf _UTF8
. Dies ist eine interessante Funktion, die sicherlich einigen Leuten helfen wird, aber es gibt einige "Macken" damit, besonders wenn UTF-8 nicht für alle Spalten verwendet wird et die Standardcollation der Datenbank, verwenden Sie sie also nicht, nur weil Sie gehört haben, dass UTF-8 auf magische Weise besser ist. UTF-8 wurde entwickelt ausschließlich für die ASCII-Kompatibilität: um es reinen ASCII-Systemen (d.h. früher UNIX) zu ermöglichen, Unicode zu unterstützen, ohne bestehenden Code oder Dateien zu ändern. Die Platzersparnis für Daten, die hauptsächlich (oder nur) US-englische Zeichen (und einige Satzzeichen) verwenden, ist ein Nebeneffekt. Wenn nicht überwiegend (oder nur) US-englische Zeichen verwendet werden, können die Daten die gleiche Größe wie UTF-16 haben oder sogar größer sein, je nachdem, welche Zeichen verwendet werden. Und in Fällen, in denen Platz gespart wird, kann sich die Leistung verbessern, aber auch verschlechtern.
Eine ausführliche Analyse dieser neuen Funktion finden Sie in meinem Beitrag, " Native UTF-8-Unterstützung in SQL Server 2019: Retter oder falscher Prophet? ".
Die Standard-Zeichencodierung für eine SQL Server-Datenbank ist iso_1, d. h. ISO 8859-1. Beachten Sie, dass die Zeichenkodierung vom Datentyp einer Spalte abhängt. Mit Hilfe dieses SQL können Sie sich ein Bild davon machen, welche Zeichenkodierungen für die Spalten in einer Datenbank verwendet werden, sowie von den Kollationen:
select data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count(*) count
from information_schema.columns
group by data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name;
Wenn der Standardwert verwendet wird, sollte der character_set_name iso_1 für die Datentypen char und varchar sein. Da nchar und nvarchar Unicode-Daten im UCS-2-Format speichern, ist der character_set_name für diese Datentypen UNICODE.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.