Was ist der Unterschied zwischen char, nchar, varchar und nvarchar in SQL Server?
-
05-07-2019 - |
Frage
Was von nvarchar
gemeint?
Was ist der Unterschied zwischen char
, nchar
, varchar
und nvarchar
in SQL Server?
Lösung
Just zu klären ... oder zusammenzufassen ...
-
nchar
undnvarchar
speichern Unicode Zeichen. -
char
undvarchar
nicht speichern Unicode Zeichen. -
char
undnchar
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
undnvarchar
sind mit variabler Länge , die nur Räume für die Charaktere aufbrauchen Sie speichern. Es nicht reserviert Speicher wiechar
odernchar
.
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
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:
- n [var] char speichert Unicode während [var] char speichert nur Single-Byte-Zeichen.
- [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.