716 Stimmen

Was ist der Unterschied zwischen char, nchar, varchar und nvarchar in SQL Server?

Was ist gemeint mit nvarchar ?

Was ist der Unterschied zwischen char , nchar , varchar et nvarchar in SQL Server?

978voto

Brian Kim Punkte 23956

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.

112voto

Martin Smith Punkte 417623

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

enter image description here

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.

44voto

Luke Bennett Punkte 32186

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 .

40voto

Dimuthu Punkte 349

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!

28voto

PeterAllenWebb Punkte 10013

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.com

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.

Powered by:

X