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

StackOverflow https://stackoverflow.com/questions/176514

  •  05-07-2019
  •  | 
  •  

Frage

Was von nvarchar gemeint?

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

War es hilfreich?

Lösung

Just zu klären ... oder zusammenzufassen ...

  • nchar und nvarchar speichern Unicode Zeichen.
  • char und varchar nicht speichern Unicode Zeichen.
  • char und nchar ist feste Länge die Reserve Speicherplatz für die Anzahl der Zeichen geben Sie auch wenn Sie nicht alle, dass der Raum aufbrauchen.
  • varchar und nvarchar sind mit variabler Länge , die nur Räume für die Charaktere aufbrauchen Sie speichern. Es nicht reserviert Speicher wie char oder nchar .

nchar und nvarchar doppelt so viel Speicherplatz einnehmen, so kann es klug sein, sie zu benutzen, nur wenn Sie benötigen Unicode Support.

Andere Tipps

Alle Antworten bisher zeigen, dass varchar einziges Byte ist, nvarchar Double-Byte ist. Der erste Teil dieses tatsächlich hängt von Sortierungs 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  

Returns

 image description hier

Beachten Sie, dass die und Zeichen waren noch nicht in der VARCHAR Version vertreten und wurden still mit ? ersetzt.

Es gibt tatsächlich noch keine chinesischen Schriftzeichen, die durch ein einzelnes Byte in dieser Zusammenstellung reprsented werden kann. Die einzigen Single-Byte-Zeichen sind der typische westliche ASCII-Zeichensatz.

Aus diesem Grunde ist es möglich, dass ein Einsatz aus einem nvarchar(X) Spalte zu einer varchar(X) Spalte mit einem Abschneidefehler auszufallen (wobei X eine Zahl bezeichnet, die die gleiche in beiden Fällen ist).

SQL Server 2012 fügt SC (Supplementary Rolle) Sortierungen, die UTF-16 unterstützen. In diesen Sortierungen ein einzelner nvarchar Charakter kann 2 oder 4 Bytes nehmen.

nchar und char ziemlich viel arbeiten auf genau die gleiche Art und Weise, wie jeder andere, wie nvarchar und varchar tun. Der einzige Unterschied zwischen ihnen ist, dass nchar / nvarchar Speicher Unicode-Zeichen (wichtig, wenn Sie die Verwendung von erweiterte Zeichensätze erfordern), während varchar nicht.

Da Unicode-Zeichen mehr Speicherplatz benötigen, nchar / nvarchar Felder nehmen doppelt so viel Platz (so zum Beispiel in früheren Versionen von SQL Server die maximale Größe eines nvarchar Feld 4000).

Diese Frage ist ein Duplikat href="https://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar">.

Just hinzuzufügen etwas mehr: nchar - fügt Leerzeichen auf die Daten hinterher. nvarchar -. Fügen Sie keine Leerzeichen zu den Daten nachlauf

Also, wenn Sie gehen, um Ihre Datenmenge von einem ‚nchar‘ Feld filtern, können Sie wollen RTRIM verwenden, um die Räume zu entfernen. Z.B. Nchar (10) -Feld genannt BRAND speichert das Wort Nike. Sie fügt hinzu, 6 Stellen nach rechts des Wortes. Also, wenn Filterung soll der Ausdruck lesen: RTRIM (Fields! BRAND.Value) = "NIKE"

Hope, das hilft jemand da draußen, weil ich mit ihm ein bisschen zu kämpfen war gerade jetzt!

Mein Versuch, zusammenzufassen und zu korrigieren, die vorhandenen Antworten:

Als erstes char und nchar wird immer eine feste Menge an Speicherplatz verwenden, auch wenn die Zeichenfolge gespeichert werden soll, kleiner als der verfügbare Platz, während varchar und nvarchar wird nur so viel Speicherplatz verwenden, wie benötigt wird, die Zeichenfolge zu speichern, (plus zwei Overhead-Bytes, die vermutlich die Länge der Zeichenfolge zu speichern). Also denken Sie daran, "var" bedeutet "Variable", wie in Variablenraum.

Der zweite wichtige Punkt zu verstehen ist, dass nchar und nvarchar Speicher-Strings 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 (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 die grundlegende Sache zu erinnern ist hier, dass nchar und nvarchar neigen dazu, eine viel bessere Wahl zu sein, wenn Sie Unterstützung der Internationalisierung möchten, die Sie wahrscheinlich tun.

Jetzt für einige einige Feinheiten.

Als erstes nchar und nvarchar Spalten immer Speichern von Daten unter Verwendung von UCS-2. Dies bedeutet, dass genau zwei Bytes pro Zeichen verwendet werden, und jedes Unicodezeichen in der Basic Multilingual Plane (BMP) durch ein nchar oder nvarchar Feld gespeichert werden. Es ist jedoch nicht der Fall, dass jeder Unicode-Zeichen gespeichert werden können. Zum Beispiel, nach Wikipedia, die Codepunkte für die ägyptischen Hieroglyphen fallen außerhalb des BMP. Es gibt also, Unicode-Strings, die in UTF-8 und anderer echten Unicode-Codierung dargestellt werden können, die nicht in einem SQL Server nchar oder nvarchar Feld gespeichert werden können, und in der ägyptischen Hieroglyphen geschrieben Saiten unter ihnen wäre. Zum Glück Ihrer Benutzer wahrscheinlich nicht schreiben in diesem Skript, aber es ist etwas im Auge zu behalten!

Ein weiterer verwirrend, aber interessanter Punkt, dass andere Plakate hervorgehoben haben, ist, dass char und varchar Felder zwei Bytes für bestimmte Zeichen pro Zeichen verwenden können, wenn die Sortierungscodepage es erfordert. (Martin Smith gibt ein hervorragendes Beispiel, in dem er zeigt, wie dieses Verhalten zeigt Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS. Probieren Sie es aus.)

UPDATE: Wie von SQL Server 2012 gibt es endlich Code Seiten für UTF-16 , zum Beispiel Latin1_General_100_CI_AS_SC, die wirklich den gesamten Unicode-Bereich abdecken können.

  • char: feste Länge Zeichendaten mit einer maximalen Länge von 8000 Zeichen
  • .
  • nchar. Feste Länge Unicode-Daten mit einer maximalen Länge von 4000 Zeichen
  • Char = 8 Bit Länge
  • NChar = 16 Bit Länge

nchar[(n)] (Volkscharakter)

  • feste Länge Unicode string Daten.
  • n definiert die String-Länge und muss einen Wert von 1 bis 4000 sein.
  • Die Speichergröße ist zweimal n Bytes.

nvarchar [(n | max)] (national unterschiedlichen Charakters.)

  • variabler Länge Unicode string Daten.
  • n definiert die String-Länge und kann ein Wert von 1 bis 4000 sein.
  • max zeigt an, dass die maximale Speichergröße beträgt 2 ^ 31-1 Bytes (2 GB).
  • Die Speichergröße in Byte wird zwei Mal die tatsächliche Länge der eingegebenen Daten + 2 Bytes

char [(n)] (Zeichen)

  • feste Länge, non-Unicode String-Daten.
  • n definiert die String-Länge und muss einen Wert von 1 bis 8000 sein.
  • Die Speichergröße ist n Bytes.

varchar [(n | max)] (character varying)

  • mit variabler Länge, Nicht-Unicode string Daten.
  • n definiert die String-Länge und kann ein Wert von 1 bis 8000 sein.
  • max zeigt an, dass die maximale Speichergröße beträgt 2 ^ 31-1 Bytes (2 GB).
  • Die Speichergröße ist die tatsächliche Länge der eingegebenen Daten + 2 Bytes.

Die Unterschiede sind:

  1. n [var] char speichert Unicode während [var] char speichert nur Single-Byte-Zeichen.
  2. [n] char eine feste Anzahl von Zeichen von der genauen Länge benötigt, während der [n] VARCHAR eine variable Anzahl von Zeichen bis zu und einschließlich der definierten Länge annimmt.

Ein weiterer Unterschied ist die Länge. Sowohl nchar und nvarchar können bis zu 4000 Zeichen lang sein. Und char und varchar können bis zu 8000 Zeichen lang sein. Aber für SQL Server können Sie auch eine [n] varchar (max) verwendet werden, die zu 2147483648 Zeichen verarbeiten kann. (Zwei Gigabyte, eine signierte 4-Byte-Ganzzahl).

nchar erfordert mehr Platz als nvarchar.

Beispiel:

Ein char (100) speichert immer 100 Zeichen, auch wenn Sie nur 5 eingeben, die 95 Zeichen verbleibende mit Leerzeichen aufgefüllt werden. Speicher 5 Zeichen in einem varchar (100) wird 5 Zeichen speichern.

nchar (10) ist ein fester Länge Unicode-String der Länge 10 nvarchar (10) ist ein variabler Länge Unicode-String mit einer maximalen Länge von 10 Normalerweise würden Sie die ehemalige verwenden, wenn alle Datenwerte 10 Zeichen sind und dies, wenn die Längen variieren.

  • nchar ist feste Länge und kann Unicode-Zeichen halten. es verwendet zwei Bytes Speicherplatz pro Zeichen.

  • varchar ist von variabler Länge und kann Unicode-Zeichen nicht halten. Sie benutzt ein Byte Speicher pro Zeichen.

NVARCHAR können Unicode-Zeichen speichern und dauert 2 Bytes pro Zeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top