Die Definition von varchar besagt jedoch, dass Nicht-Unicode-Zeichenfolgendaten zulässig sind . Die Symbole Trademark (™) und Registered (®) sind jedoch Unicode- Zeichen . Widerspricht die Definition der Eigenschaft des Datentyps varchar?
Die anderen Antworten sind zwar nicht falsch, aber ich denke, es würde helfen, auf eine Verwirrung in der Basisterminologie hinzuweisen. Ich habe im obigen Zitat zwei Wörter aus der Frage als Beispiel für diese Verwirrung hervorgehoben. Wenn in der SQL Server-Dokumentation von Unicode- und Nicht-Unicode- Daten die Rede ist , handelt es sich nicht um die Zeichen . Sie sprechen von den Bytefolgen, die bestimmte Zeichen darstellen. Der Hauptunterschied zwischen den Unicode - Typen ( NCHAR
, NVARCHAR
, XML
, und die veralteten / Übel NTEXT
) und dem nicht-Unicode - Typen ( CHAR
, VARCHAR
und die veralteten / Übel TEXT
) ist , was Arten von Bytefolgen sie speichern können.
Die Nicht-Unicode-Typen speichern eine von mehreren 8-Bit-Codierungen, während die Unicode-Typen eine einzige 16-Bit-Unicode-Codierung speichern: UTF-16 Little Endian. Wie die anderen Antworten bereits erwähnt haben, hängt es von der Codepage ab, die durch die Sortierung bestimmt wird, welche Zeichen in einer 8-Bit- / Nicht-Unicode-Codierung gespeichert werden können. Während andere festgestellt haben, dass der Bytewert eines "Zeichens" von Codepage zu Codepage variieren kann, kann der Bytewert sogar innerhalb derselben Codepage variieren, wenn es sich um eine der mehreren EBCDIC-Codepages handelt (Variationen von Windows-Codepages). 1252), die nur in älteren Versionen zu finden sind, sollten nicht unbedingt für SQL Server-Kollatierungen verwendet werden (dh solche mit Namen, die mit beginnen SQL_
).
Daher ist die Definition korrekt: Alle Zeichen, die Sie in einem Nicht-Unicode-Typ speichern können, sind immer 8-Bit-Zeichen (auch wenn sie zwei 8-Bit-Werte in Kombination als ein einziges "Zeichen" verwenden). Byte Character Set / DBCS-Codepages berücksichtigen). Und die Unicode-Datentypen sind immer 16-Bit, auch wenn sie manchmal zwei 16-Bit-Werte in Kombination als ein einzelnes "Zeichen" verwenden (dh ein Ersatzpaar, das wiederum ein Zusatzzeichen darstellt).
UND, da SQL Server die UTF-8-Codierung für VARCHAR
und CHAR
Datentypen ab SQL Server 2019 nativ unterstützt ,
VARCHAR
kann nicht mehr als "Nicht-Unicode" bezeichnet werden. Ab der ersten öffentlichen Betaversion von SQL Server 2019 im September 2018 sollten wir von VARCHAR
einem "8-Bit-Datentyp" sprechen, auch wenn es sich um Versionen vor SQL Server 2019 handelt. Diese Terminologie gilt für alle vier Typen von Kodierungen, die verwendet werden können mit VARCHAR
:
- Erweitertes ASCII
- Doppelbyte-Zeichensätze (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Lediglich der TEXT
Datentyp (der ab SQL Server 2005 veraltet ist, verwenden Sie ihn also nicht mehr) ist "Nicht-Unicode", dies ist jedoch nur eine technische Angelegenheit, und es ist korrekt, ihn als "8-Bit-Datentyp" zu bezeichnen.
NVARCHAR
, NCHAR
Und NTEXT
kann als „UTF-16“ oder „16-Bit - Datentyp“ bezeichnet werden. Ich glaube, Oracle verwendet die Terminologie von "Unicode-only" für NVARCHAR
, aber das schließt nicht eindeutig die Möglichkeit aus, UTF-8 (auch eine Unicode-Codierung) zu verwenden, die nicht funktioniert die ersten beiden Möglichkeiten.
Einzelheiten zu den neuen UTF-8-Codierungen finden Sie in meinem Beitrag:
Native UTF-8-Unterstützung in SQL Server 2019: Retter oder falscher Prophet?
PS Ich arbeite mich langsam durch die Aktualisierung der SQL Server-Dokumentation, um diese Änderungen zu berücksichtigen.
PPS Microsoft hat bereits einige Seiten mit UTF-8-Informationen aktualisiert, einschließlich der Char- und Varchar- Dokumentation, auf die in der Frage verwiesen wird. Es enthält nicht länger die Phrase "non-Unicode". Aber das ist nur eine FYI; Dies ändert nichts an der Frage, da es sich um Nicht-Unicode-Codierungen handelt, die Zeichen enthalten, die fälschlicherweise als reine Unicode-Codierungen angesehen wurden.