Co to znaczy nvarchar
?
Jaka jest różnica między char
, nchar
,varchar
, i nvarchar
SQL Server?
Co to znaczy nvarchar
?
Jaka jest różnica między char
, nchar
,varchar
, i nvarchar
SQL Server?
Odpowiedzi:
Aby wyjaśnić ... lub podsumować ...
nchar
i nvarchar
może przechowywać znaki Unicode .char
i nie może przechowywać znaków Unicode .varchar
char
i nchar
mają stałą długość, która zarezerwuje miejsce do przechowywania określonej liczby znaków, nawet jeśli nie wykorzystasz całej tej przestrzeni.varchar
i nvarchar
mają zmienną długość, która zużyje spacje tylko dla przechowywanych znaków. Nie rezerwuje miejsca takiego jak char
lubnchar
.nchar
i nvarchar
zajmie dwa razy więcej miejsca do przechowywania, więc rozsądne może być użycie ich tylko wtedy, gdy potrzebujesz obsługi Unicode .
n...
wersje zajmują dwa razy więcej miejsca do przechowywania, niż pokazuje moja odpowiedź
Wszystkie dotychczasowe odpowiedzi wskazują, że varchar
jest to jeden bajt, nvarchar
jest dwubajtowy. Pierwsza część tego zależy od sortowania, jak pokazano poniżej.
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
Zwroty
Zauważ, że znaki 华
i 国
nadal nie były reprezentowane w VARCHAR
wersji i zostały po cichu zastąpione przez?
.
W rzeczywistości nadal nie ma chińskich znaków, które mogą być reprezentowane przez jeden bajt w tym zestawieniu. Jedynymi jednobajtowymi znakami są typowe zachodnie zestawy ASCII.
Z tego powodu możliwe jest, że wstawianie z nvarchar(X)
kolumny do varchar(X)
kolumny nie powiedzie się z powodu błędu obcięcia (gdzie X oznacza liczbę, która jest taka sama w obu przypadkach).
SQL Server 2012 dodaje obsługiwane przez SC sortowania znaków uzupełniających UTF-16
. W tych zestawieniach pojedynczy nvarchar
znak może zająć 2 lub 4 bajty.
nchar i char działają prawie tak samo jak nawzajem, podobnie jak nvarchar i varchar. Jedyna różnica między nimi polega na tym, że nchar / nvarchar przechowuje znaki Unicode (niezbędne, jeśli wymagane jest użycie rozszerzonych zestawów znaków), podczas gdy varchar tego nie robi.
Ponieważ znaki Unicode wymagają więcej pamięci, pola nchar / nvarchar zajmują dwa razy więcej miejsca (więc na przykład we wcześniejszych wersjach SQL Server maksymalny rozmiar pola nvarchar wynosi 4000).
To pytanie jest duplikatem tego .
Aby dodać coś jeszcze: nchar - dodaje końcowe spacje do danych. nvarchar - nie dodaje końcowych spacji do danych.
Tak więc, jeśli zamierzasz przefiltrować zestaw danych według pola „nchar”, możesz użyć RTRIM do usunięcia spacji. Np. Pole nchar (10) o nazwie BRAND przechowuje słowo NIKE. Dodaje 6 spacji po prawej stronie słowa. Tak więc podczas filtrowania wyrażenie powinno brzmieć: RTRIM (Fields! BRAND.Value) = "NIKE"
Mam nadzieję, że to pomaga komuś tam, bo właśnie przez chwilę z tym walczyłem!
Moja próba streszczenia i poprawienia istniejących odpowiedzi:
Po pierwsze char
i nchar
zawsze będzie używać stałej ilości miejsca do przechowywania, nawet jeśli ciąg do przechowywania jest mniejszy niż dostępne miejsce, varchar
a jednocześnie nvarchar
zużyje tylko tyle miejsca, ile jest potrzebne do przechowywania tego ciągu (plus dwa bajty narzutu, przypuszczalnie do przechowywania długości łańcucha). Pamiętaj więc, że „var” oznacza „zmienną”, podobnie jak w przestrzeni zmiennej.
Drugim ważnym punktem do zrozumienia jest to, że nchar
i nvarchar
przechowujemy ciągi znaków, używając dokładnie dwóch bajtów na znak, char
a także varchar
używamy kodowania określonego przez stronę kodową sortowania, który zwykle będzie dokładnie jednym bajtem na znak (chociaż są wyjątki, patrz poniżej). Używając dwóch bajtów na znak, można przechowywać bardzo szeroki zakres znaków, więc podstawową rzeczą do zapamiętania tutaj jest to nchar
i nvarchar
zwykle jest on znacznie lepszym wyborem, gdy potrzebujesz obsługi internacjonalizacji, co prawdopodobnie robisz.
Teraz kilka drobniejszych punktów.
Po pierwsze, nchar
i nvarchar
kolumny zawsze przechowywać dane przy użyciu UCS-2. Oznacza to, że zostaną użyte dokładnie dwa bajty na znak, a dowolny znak Unicode w Basic Multilingual Plane (BMP) może być przechowywany przez pole nchar
lub nvarchar
. Jednak nie jest tak, że można zapisać dowolny znak Unicode. Na przykład według Wikipedii punkty kodowe egipskich hieroglifów nie mieszczą się w zakresie BMP. Istnieją zatem ciągi znaków Unicode, które mogą być reprezentowane w UTF-8, i inne prawdziwe kodowania Unicode, których nie można przechowywać w SQL Server nchar
lub nvarchar
polu, a wśród nich byłyby ciągi napisane w egipskich hieroglifach. Na szczęście użytkownicy prawdopodobnie nie piszą w tym skrypcie, ale warto o tym pamiętać!
Innym interesującym punktem jednak mylące, że inne plakaty podkreśliły, że char
i varchar
pola mogą korzystać z dwóch bajtów na znak dla pewnych znaków czy strona kodowa sortowania wymaga. (Martin Smith podaje doskonały przykład, w którym pokazuje, jak Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS wykazuje to zachowanie. Sprawdź to.)
AKTUALIZACJA: Począwszy od SQL Server 2012, są wreszcie strony kodowe dla UTF-16 , na przykład Latin1_General_100_CI_AS_SC, które mogą naprawdę obejmować cały zakres Unicode.
char
: dane o stałej długości o maksymalnej długości 8000 znaków.nchar
: dane Unicode o stałej długości i maksymalnej długości 4000 znaków.Char
= 8 bitów długościNChar
= 16 bitów długościchar
nie może mieć długości 8 bitów. Nie musi przechowywać długości, a stała długość może wynosić do 8000 znaków.
nchar[(n)]
(charakter narodowy)
n
określa długość łańcucha i musi mieć wartość od 1 do 4 000.n
bajty.nvarchar [(n | max)]
(charakter narodowy różni się.)
n
określa długość łańcucha i może mieć wartość od 1 do 4 000.max
wskazuje, że maksymalny rozmiar pamięci to 2 ^ 31-1 bajtów (2 GB).char [(n)]
(postać)
non-Unicode
Dane łańcuchowe o stałej długości .n
określa długość łańcucha i musi mieć wartość od 1 do 8 000.n
bajty.varchar [(n | max)]
(różni się charakter)
n
określa długość łańcucha i może mieć wartość od 1 do 8 000.max
wskazuje, że maksymalny rozmiar pamięci to 2 ^ 31-1 bajtów (2 GB).Różnice są następujące:
Kolejną różnicą jest długość. Zarówno nchar, jak i nvarchar mogą mieć do 4000 znaków. A char i varchar mogą mieć do 8000 znaków. Ale w przypadku SQL Server można również użyć [n] varchar (max), który może obsłużyć do 2 147 483 648 znaków. (Dwa gigabajty, 4-bajtowa liczba całkowita ze znakiem).
nchar wymaga więcej miejsca niż nvarchar.
na przykład,
Nchar (100) zawsze będzie przechowywać 100 znaków, nawet jeśli wpiszesz tylko 5, pozostałe 95 znaków zostanie wypełnionych spacjami. Przechowywanie 5 znaków w nvarchar (100) spowoduje zapisanie 5 znaków.
nchar (10) to ciąg Unicode o stałej długości o długości 10. nvarchar (10) to ciąg Unicode o zmiennej długości o maksymalnej długości 10. Zwykle użyłbyś tego pierwszego, gdyby wszystkie wartości danych miały 10 znaków, a drugiego jeśli długości się różnią.
nchar ma stałą długość i może przechowywać znaki Unicode. wykorzystuje dwa bajty pamięci na znak.
varchar ma zmienną długość i nie może przechowywać znaków Unicode. używa jednego bajtu pamięci na znak.
UCS-2
(co zdarza się kodowanie używane przez SQL Server) przechowuje każdy znak w dokładnie dwa bajty, zobacz 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 może korzystać z kompresji SCSU, ale nadal jest kompresją ciągów znaków Unicode zakodowanych w UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspx
NVARCHAR może przechowywać znaki Unicode i zajmuje 2 bajty na znak.
nvarchar
zawsze zajmuje 2 bajty na znak.