Was ist gemeint mit nvarchar
?
Was ist der Unterschied zwischen char
, nchar
, varchar
et nvarchar
in SQL Server?
Was ist gemeint mit nvarchar
?
Was ist der Unterschied zwischen char
, nchar
, varchar
et nvarchar
in SQL Server?
Nur um das klarzustellen... oder zusammenzufassen...
nchar
y nvarchar
kann speichern Unicode Zeichen.char
y varchar
kann Unicode nicht speichern Zeichen.char
y nchar
sont Feste Länge die Speicherplatz reservieren für die von Ihnen angegebene Anzahl von Zeichen, auch wenn Sie nicht den gesamten Platz verwenden.varchar
y nvarchar
sont variable Länge die nur Leerzeichen für die von Ihnen gespeicherten Zeichen verwendet. Es reserviert keinen Speicherplatz wie char
o nchar
.nchar
y nvarchar
nehmen doppelt so viel Speicherplatz in Anspruch, so dass es ratsam sein kann, sie nur zu verwenden, wenn Sie Unicode Unterstützung.
Alle bisherigen Antworten deuten darauf hin, dass varchar
ist ein einzelnes Byte, nvarchar
ist ein Doppelbyte. Der erste Teil davon ist eigentlich hängt 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
Rückgabe
Beachten Sie, dass die y Zeichen noch immer nicht in der VARCHAR
Version und wurden stillschweigend ersetzt durch ?
.
Es gibt immer noch keine chinesischen Zeichen, die durch ein einziges Byte in dieser Sortierung dargestellt werden können. Die einzigen Einzelbyte-Zeichen sind der typische westliche ASCII-Satz.
Aus diesem Grund ist es möglich, dass eine Einfügung aus einer nvarchar(X)
Spalte zu einer varchar(X)
Spalte mit einem Trunkierungsfehler fehlschlagen (wobei X eine Zahl bezeichnet, die in beiden Fällen dieselbe ist).
SQL Server 2012 fügt SC-Sortierungen (Supplementary Character) hinzu, die Folgendes unterstützen UTF-16
. In diesen Zusammenstellungen wird eine einzige nvarchar
Zeichen kann 2 oder 4 Bytes umfassen.
Nchar und char funktionieren so ziemlich genau gleich, ebenso wie nvarchar und varchar. Der einzige Unterschied zwischen ihnen besteht darin, dass nchar/nvarchar Unicode-Zeichen speichern (unerlässlich, wenn Sie erweiterte Zeichensätze verwenden wollen), während varchar dies nicht tut.
Da Unicode-Zeichen mehr Speicherplatz benötigen, nehmen nchar/nvarchar-Felder doppelt so viel Platz in Anspruch (so beträgt beispielsweise in früheren Versionen von SQL Server die maximale Größe eines nvarchar-Feldes 4000).
Diese Frage ist ein Duplikat von este .
Ich möchte nur noch etwas hinzufügen: nchar - fügt den Daten Leerzeichen am Ende hinzu. nvarchar - fügt den Daten keine Leerzeichen am Ende hinzu.
Wenn Sie also Ihren Datensatz nach einem "nchar"-Feld filtern wollen, sollten Sie RTRIM verwenden, um die Leerzeichen zu entfernen. Z.B. nchar(10)-Feld namens BRAND speichert das Wort NIKE. Es fügt 6 Leerzeichen rechts von dem Wort hinzu. Beim Filtern sollte der Ausdruck also lauten: RTRIM(Fields!BRAND.Value) = "NIKE"
Ich hoffe, das hilft jemandem da draußen, denn ich hatte gerade ein bisschen damit zu kämpfen!
Mein Versuch, die vorhandenen Antworten zusammenzufassen und zu korrigieren:
Erstens, char
y nchar
immer eine feste Menge an Speicherplatz, auch wenn die zu speichernde Zeichenkette kleiner ist als der verfügbare Platz, während varchar
y nvarchar
verwendet nur so viel Speicherplatz, wie für die Speicherung dieser Zeichenkette benötigt wird (plus zwei Bytes Overhead, vermutlich für die Speicherung der Zeichenkettenlänge). Denken Sie also daran, dass "var" "variabel" bedeutet, wie bei variablem Speicherplatz.
Der zweite wichtige Punkt, den es zu verstehen gilt, ist der, nchar
y nvarchar
Zeichenketten speichern mit genau zwei Bytes pro Zeichen, während char
y varchar
eine Kodierung verwenden, die durch die Sortiercodeseite bestimmt wird, die in der Regel genau ein Byte pro Zeichen sein (es gibt jedoch Ausnahmen, siehe unten). Durch die Verwendung von zwei Bytes pro Zeichen kann eine sehr große Anzahl von Zeichen gespeichert werden, so dass man sich hier grundsätzlich merken sollte, dass nchar
y nvarchar
sind in der Regel die bessere Wahl, wenn Sie Internationalisierungsunterstützung wünschen, was Sie wahrscheinlich tun.
Nun zu einigen Feinheiten.
Erstens, nchar
y nvarchar
Spalten siempre Daten mit UCS-2 zu speichern. Das bedeutet, dass genau zwei Bytes pro Zeichen verwendet werden und dass jedes Unicode-Zeichen in der Basic Multilingual Plane (BMP) mit einem nchar
o nvarchar
Bereich. Es ist jedoch nicht der Fall, dass jede Es können Unicode-Zeichen gespeichert werden. Laut Wikipedia fallen zum Beispiel die Codepunkte für ägyptische Hieroglyphen nicht in den BMP. Es gibt also Unicode-Zeichenfolgen, die in UTF-8 dargestellt werden können, und andere echte Unicode-Kodierungen, die nicht in einem SQL-Server gespeichert werden können nchar
o nvarchar
und Zeichenketten, die in ägyptischen Hieroglyphen geschrieben sind, würden dazu gehören. Zum Glück schreiben Ihre Benutzer wahrscheinlich nicht in dieser Schrift, aber es ist etwas, das man im Hinterkopf behalten sollte!
Ein weiterer verwirrender, aber interessanter Punkt, den andere Poster hervorgehoben haben, ist, dass char
y varchar
Felder können für bestimmte Zeichen zwei Bytes pro Zeichen verwenden, wenn die Sortiercodeseite dies erfordert. (Martin Smith gibt ein ausgezeichnetes Beispiel, in dem er zeigt, wie Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS dieses Verhalten zeigt. Sehen Sie es sich an.)
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 kann.
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.