Co to znaczy nvarchar
?
Jaka jest różnica między char
, nchar
,varchar
, i nvarchar
SQL Server?
sql-server
varchar
MrDatabase
źródło
źródło
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.Zwroty
Zauważ, że znaki
华
i国
nadal nie były reprezentowane wVARCHAR
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 dovarchar(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 pojedynczynvarchar
znak może zająć 2 lub 4 bajty.źródło
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 .
źródło
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!
źródło
Moja próba streszczenia i poprawienia istniejących odpowiedzi:
Po pierwsze
char
inchar
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śnienvarchar
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
invarchar
przechowujemy ciągi znaków, używając dokładnie dwóch bajtów na znak,char
a takżevarchar
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 tonchar
invarchar
zwykle jest on znacznie lepszym wyborem, gdy potrzebujesz obsługi internacjonalizacji, co prawdopodobnie robisz.Teraz kilka drobniejszych punktów.
Po pierwsze,
nchar
invarchar
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 polenchar
lubnvarchar
. 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 Servernchar
lubnvarchar
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
ivarchar
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.
źródło
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ściźródło
char
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ódło
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).
źródło
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.
źródło
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ą.
źródło
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.
źródło
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.aspxNVARCHAR może przechowywać znaki Unicode i zajmuje 2 bajty na znak.
źródło
nvarchar
zawsze zajmuje 2 bajty na znak.