Co to znaczy nvarchar?
Jaka jest różnica między char, nchar,varchar , i nvarcharSQL Server?
Co to znaczy nvarchar?
Jaka jest różnica między char, nchar,varchar , i nvarcharSQL Server?
Odpowiedzi:
Aby wyjaśnić ... lub podsumować ...
nchari nvarcharmoże przechowywać znaki Unicode .chari nie może przechowywać znaków Unicode .varchar chari ncharmają stałą długość, która zarezerwuje miejsce do przechowywania określonej liczby znaków, nawet jeśli nie wykorzystasz całej tej przestrzeni.varchari nvarcharmają zmienną długość, która zużyje spacje tylko dla przechowywanych znaków. Nie rezerwuje miejsca takiego jak charlubnchar .nchari nvarcharzajmie 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 varcharjest 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 VARCHARwersji 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 nvarcharznak 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 chari ncharzawsze będzie używać stałej ilości miejsca do przechowywania, nawet jeśli ciąg do przechowywania jest mniejszy niż dostępne miejsce, varchara jednocześnie nvarcharzuż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 nchari nvarcharprzechowujemy ciągi znaków, używając dokładnie dwóch bajtów na znak, chara także varcharuż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 nchari nvarcharzwykle jest on znacznie lepszym wyborem, gdy potrzebujesz obsługi internacjonalizacji, co prawdopodobnie robisz.
Teraz kilka drobniejszych punktów.
Po pierwsze, nchari nvarcharkolumny 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 ncharlub 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 ncharlub nvarcharpolu, 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 chari varcharpola 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ścicharnie 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.nbajty.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-UnicodeDane łańcuchowe o stałej długości .n określa długość łańcucha i musi mieć wartość od 1 do 8 000.nbajty.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.
nvarcharzawsze zajmuje 2 bajty na znak.