Was ist damit gemeint nvarchar
?
Was ist der Unterschied zwischen char
, nchar
, varchar
und nvarchar
in SQL Server?
Was ist damit gemeint nvarchar
?
Was ist der Unterschied zwischen char
, nchar
, varchar
und nvarchar
in SQL Server?
Antworten:
Nur um aufzuklären ... oder zusammenzufassen ...
nchar
und nvarchar
kann Unicode- Zeichen speichern .char
und kann keine Unicode- Zeichen speichern .varchar
char
und nchar
haben eine feste Länge, die Speicherplatz für die von Ihnen angegebene Anzahl von Zeichen reserviert , auch wenn Sie nicht den gesamten Speicherplatz belegen.varchar
und nvarchar
haben eine variable Länge, die nur Leerzeichen für die von Ihnen gespeicherten Zeichen verbraucht. Es wird kein Speicher wie char
oder reserviertnchar
.nchar
und nvarchar
nimmt doppelt so viel Speicherplatz ein, daher ist es möglicherweise ratsam, sie nur zu verwenden, wenn Sie Unicode- Unterstützung benötigen .
Alle bisherigen Antworten geben an, dass varchar
es sich bei einem Einzelbyte nvarchar
um ein Doppelbyte handelt. Der erste Teil davon hängt tatsächlich von der Sortierung ab, wie unten dargestellt.
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');
SELECT C1,
C2,
LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T
Kehrt zurück
Beachten Sie, dass die Zeichen 华
und 国
in der VARCHAR
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 eine varchar(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 einzelnes nvarchar
Zeichen 2 oder 4 Bytes benötigen.
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 .
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!
Mein Versuch, die vorhandenen Antworten zusammenzufassen und zu korrigieren:
Erstens char
und verwendet nchar
immer eine feste Menge an Speicherplatz, selbst wenn die zu speichernde Zeichenfolge kleiner als der verfügbare Speicherplatz ist, während varchar
und nvarchar
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
und nvarchar
Speichern von Zeichenfolgen mit genau zwei Bytes pro Zeichen, während char
und varchar
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 , dass nchar
und nvarchar
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
und nvarchar
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 ein nchar
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 Server nchar
oder nvarchar
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
und varchar
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.
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ängechar
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.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.)
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.
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.
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.
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.aspx
NVARCHAR kann Unicode-Zeichen speichern und benötigt 2 Bytes pro Zeichen.
nvarchar
immer 2 Bytes pro Zeichen.