Was ist damit gemeint nvarchar
?
Was ist der Unterschied zwischen char
, nchar
, varchar
und nvarchar
in SQL Server?
sql-server
varchar
MrDatabase
quelle
quelle
n...
Versionen doppelt so viel SpeicherplatzAlle bisherigen Antworten geben an, dass
varchar
es sich bei einem Einzelbytenvarchar
um ein Doppelbyte handelt. Der erste Teil davon hängt tatsächlich von der Sortierung ab, wie unten dargestellt.Kehrt zurück
Beachten Sie, dass die Zeichen
华
und国
in derVARCHAR
Version immer noch nicht dargestellt wurden und stillschweigend durch ersetzt wurden?
.Es gibt tatsächlich noch keine chinesischen Schriftzeichen, die durch ein einzelnes Byte in dieser Zusammenstellung dargestellt werden können. Die einzigen Einzelbytezeichen sind die typischen westlichen ASCII-Sätze.
Aus diesem Grund kann ein Einfügen von einer
nvarchar(X)
Spalte in einevarchar(X)
Spalte mit einem Kürzungsfehler fehlschlagen (wobei X eine Zahl bezeichnet, die in beiden Fällen gleich ist).SQL Server 2012 fügt unterstützende SC-Kollatierungen (Supplementary Character) hinzu
UTF-16
. In diesen Kollatierungen kann ein einzelnesnvarchar
Zeichen 2 oder 4 Bytes benötigen.quelle
nchar und char funktionieren genauso wie nvarchar und varchar. Der einzige Unterschied zwischen ihnen besteht darin, dass nchar / nvarchar Unicode-Zeichen speichert (wichtig, wenn Sie erweiterte Zeichensätze benötigen), während varchar dies nicht tut.
Da Unicode-Zeichen mehr Speicherplatz benötigen, belegen nchar / nvarchar-Felder doppelt so viel Speicherplatz (beispielsweise beträgt die maximale Größe eines nvarchar-Felds in früheren Versionen von SQL Server 4000).
Diese Frage ist ein Duplikat dieser Frage .
quelle
Nur um noch etwas hinzuzufügen: nchar - fügt den Daten nachgestellte Leerzeichen hinzu. nvarchar - fügt den Daten keine nachgestellten Leerzeichen hinzu.
Wenn Sie also Ihr Dataset nach einem 'nchar'-Feld filtern möchten, können Sie die Leerzeichen mit RTRIM entfernen. Das Feld nchar (10) mit dem Namen BRAND speichert beispielsweise das Wort NIKE. Es werden 6 Leerzeichen rechts vom Wort hinzugefügt. Beim Filtern sollte der Ausdruck also lauten: RTRIM (Fields! BRAND.Value) = "NIKE"
Hoffe, das hilft jemandem da draußen, weil ich gerade ein bisschen damit zu kämpfen hatte!
quelle
Mein Versuch, die vorhandenen Antworten zusammenzufassen und zu korrigieren:
Erstens
char
und verwendetnchar
immer eine feste Menge an Speicherplatz, selbst wenn die zu speichernde Zeichenfolge kleiner als der verfügbare Speicherplatz ist, währendvarchar
undnvarchar
nur so viel Speicherplatz verwendet wird, wie zum Speichern dieser Zeichenfolge erforderlich ist (plus zwei Byte Overhead). vermutlich um die Stringlänge zu speichern). Denken Sie also daran, "var" bedeutet "Variable", wie im variablen Raum.Der zweite wichtige Punkt zu verstehen ist , dass,
nchar
undnvarchar
Speichern von Zeichenfolgen mit genau zwei Bytes pro Zeichen, währendchar
undvarchar
eine Codierung durch die Sortiercodepage bestimmt verwenden, das wird in der Regel genau ein Byte pro Zeichen sein (obwohl es Ausnahmen gibt, siehe unten). Durch die Verwendung von zwei Bytes pro Zeichen kann ein sehr breites Spektrum von Zeichen gespeichert werden, so dass hier die grundlegende Sache zu erinnern ist , dassnchar
undnvarchar
neigen dazu , eine viel bessere Wahl zu sein , wenn Sie Unterstützung der Internationalisierung mögen, die Sie wahrscheinlich tun.Nun zu einigen Feinheiten.
Erstens
nchar
undnvarchar
Spalten speichern Daten immer mit UCS-2. Dies bedeutet, dass genau zwei Bytes pro Zeichen verwendet werden und jedes Unicode-Zeichen in der mehrsprachigen Basisebene (BMP) durch einnchar
oder-nvarchar
Feld gespeichert werden kann . Es ist jedoch nicht der Fall, dass ein Unicode-Zeichen gespeichert werden kann. Laut Wikipedia liegen die Codepunkte für ägyptische Hieroglyphen beispielsweise außerhalb des BMP. Es gibt daher Unicode-Zeichenfolgen, die in UTF-8 dargestellt werden können, und andere echte Unicode-Codierungen, die nicht in einem SQL Servernchar
odernvarchar
Feld gespeichert werden können , und Zeichenfolgen, die in ägyptischen Hieroglyphen geschrieben sind, gehören dazu. Glücklicherweise schreiben Ihre Benutzer wahrscheinlich nicht in dieses Skript, aber es ist etwas zu beachten!Ein weiterer verwirrend , aber interessanter Punkt , dass andere Plakate hervorgehoben haben , ist , dass
char
undvarchar
Felder zwei Bytes pro Zeichen für bestimmte Zeichen verwendet werden können , wenn die Sortierungscodepage es erfordert. (Martin Smith gibt ein hervorragendes Beispiel, in dem er zeigt, wie Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS dieses Verhalten zeigt. Probieren Sie es aus.)UPDATE: Ab SQL Server 2012 gibt es endlich Codepages für UTF-16 , zum Beispiel Latin1_General_100_CI_AS_SC, die wirklich den gesamten Unicode-Bereich abdecken können.
quelle
char
: Zeichendaten fester Länge mit einer maximalen Länge von 8000 Zeichen.nchar
: Unicode-Daten fester Länge mit einer maximalen Länge von 4000 Zeichen.Char
= 8 Bit LängeNChar
= 16 Bit Längequelle
char
konnte keine 8-Bit-Länge haben. Die Länge muss nicht gespeichert werden, und die feste Länge kann bis zu 8000 Zeichen betragen.nchar[(n)]
(Volkscharakter)n
Definiert die Zeichenfolgenlänge und muss einen Wert zwischen 1 und 4.000 haben.n
Bytes.nvarchar [(n | max)]
(Nationaler Charakter variiert.)n
Definiert die Zeichenfolgenlänge und kann einen Wert zwischen 1 und 4.000 haben.max
gibt an, dass die maximale Speichergröße 2 ^ 31-1 Byte (2 GB) beträgt.char [(n)]
(Charakter)non-Unicode
Zeichenfolgendaten mit fester Länge .n
Definiert die Zeichenfolgenlänge und muss einen Wert zwischen 1 und 8.000 haben.n
Bytes.varchar [(n | max)]
(Zeichen variieren)n
Definiert die Zeichenfolgenlänge und kann einen Wert zwischen 1 und 8.000 haben.max
gibt an, dass die maximale Speichergröße 2 ^ 31-1 Byte (2 GB) beträgt.quelle
Die Unterschiede sind:
Ein weiterer Unterschied ist die Länge. Sowohl nchar als auch nvarchar können bis zu 4.000 Zeichen lang sein. Und char und varchar können bis zu 8000 Zeichen lang sein. Für SQL Server können Sie jedoch auch einen [n] varchar (max) verwenden, der bis zu 2.147.483.648 Zeichen verarbeiten kann. (Zwei Gigabyte, eine vorzeichenbehaftete 4-Byte-Ganzzahl.)
quelle
nchar benötigt mehr Platz als nvarchar.
z.B,
Ein nchar (100) speichert immer 100 Zeichen, auch wenn Sie nur 5 eingeben. Die verbleibenden 95 Zeichen werden mit Leerzeichen aufgefüllt. Wenn Sie 5 Zeichen in einem nvarchar (100) speichern, werden 5 Zeichen gespeichert.
quelle
nchar (10) ist eine Unicode-Zeichenfolge mit fester Länge der Länge 10. nvarchar (10) ist eine Unicode-Zeichenfolge mit variabler Länge und einer maximalen Länge von 10. Normalerweise verwenden Sie die erstere, wenn alle Datenwerte 10 Zeichen und die letztere sind wenn die Längen variieren.
quelle
nchar hat eine feste Länge und kann Unicode-Zeichen enthalten. Es verwendet zwei Bytes Speicher pro Zeichen.
varchar hat eine variable Länge und kann keine Unicode-Zeichen enthalten. Es wird ein Byte-Speicher pro Zeichen verwendet.
quelle
UCS-2
(was zufällig die von SQL Server verwendete Codierung ist) speichert jedes Zeichen in genau zwei Bytes, siehe msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx :SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 kann die SCSU-Komprimierung verwenden, komprimiert jedoch weiterhin die UCS-2-codierten Unicode-Zeichenfolgen: msdn.microsoft.com/en-us/library/ee240835.aspxNVARCHAR kann Unicode-Zeichen speichern und benötigt 2 Bytes pro Zeichen.
quelle
nvarchar
immer 2 Bytes pro Zeichen.