Cosa si intende con nvarchar
?
Qual è la differenza tra char
, nchar
, varchar
, e nvarchar
in SQL Server?
Cosa si intende con nvarchar
?
Qual è la differenza tra char
, nchar
, varchar
, e nvarchar
in SQL Server?
Risposte:
Solo per chiarire ... o riassumere ...
nchar
e nvarchar
può memorizzare caratteri Unicode .char
e non può memorizzare caratteri Unicode .varchar
char
e nchar
sono a lunghezza fissa che riservano spazio di archiviazione per il numero di caratteri specificati anche se non si utilizza tutto quello spazio.varchar
e nvarchar
sono di lunghezza variabile che utilizzerà solo gli spazi per i personaggi che memorizzi. Non riserverà l'archiviazione come char
onchar
.nchar
e nvarchar
occuperà il doppio dello spazio di archiviazione, quindi potrebbe essere saggio usarli solo se è necessario il supporto Unicode .
n...
versioni occupano o meno il doppio dello spazio di archiviazione rispetto alla mia risposta
Tutte le risposte finora indicano che varchar
è singolo byte, nvarchar
è doppio byte. La prima parte di questo in realtà dipende dalle regole di confronto, come illustrato di seguito.
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
ritorna
Nota che i caratteri 华
e 国
non erano ancora rappresentati nella VARCHAR
versione e sono stati silenziosamente sostituiti con ?
.
In realtà non ci sono ancora caratteri cinesi che possono essere rappresentati da un singolo byte in quel confronto. Gli unici caratteri a byte singolo sono il tipico set ASCII occidentale.
Per questo motivo è possibile che un inserimento da una nvarchar(X)
colonna a una varchar(X)
colonna fallisca con un errore di troncamento (dove X indica un numero uguale in entrambi i casi).
SQL Server 2012 aggiunge regole di confronto SC (carattere supplementare) che supportano UTF-16
. In queste regole di confronto un singolo nvarchar
carattere può richiedere 2 o 4 byte.
nchar e char funzionano praticamente nello stesso modo l'uno dell'altro, così come nvarchar e varchar. L'unica differenza tra loro è che nchar / nvarchar memorizza i caratteri Unicode (essenziali se si richiede l'uso di set di caratteri estesi) mentre varchar no.
Poiché i caratteri Unicode richiedono più spazio di archiviazione, i campi nchar / nvarchar occupano il doppio dello spazio (quindi ad esempio nelle versioni precedenti di SQL Server la dimensione massima di un campo nvarchar è 4000).
Questa domanda è una copia di questa .
Solo per aggiungere qualcosa in più: nchar - aggiunge spazi finali ai dati. nvarchar : non aggiunge spazi finali ai dati.
Pertanto, se si intende filtrare il set di dati in base a un campo 'nchar', è possibile utilizzare RTRIM per rimuovere gli spazi. Ad esempio, il campo nchar (10) chiamato BRAND memorizza la parola NIKE. Aggiunge 6 spazi a destra della parola. Quindi, durante il filtraggio, l'espressione dovrebbe essere: RTRIM (Fields! BRAND.Value) = "NIKE"
Spero che questo aiuti qualcuno là fuori perché stavo lottando con esso per un po 'proprio ora!
Il mio tentativo di riassumere e correggere le risposte esistenti:
Innanzitutto, char
e nchar
utilizzerà sempre una quantità fissa di spazio di archiviazione, anche quando la stringa da archiviare è più piccola dello spazio disponibile, mentre varchar
e nvarchar
utilizzerà solo lo spazio di archiviazione necessario per archiviare quella stringa (più due byte di overhead, presumibilmente per memorizzare la lunghezza della stringa). Quindi ricorda, "var" significa "variabile", come nello spazio variabile.
Il secondo punto importante da capire è quello, nchar
e nvarchar
memorizzare le stringhe usando esattamente due byte per carattere, mentre char
e varchar
usare una codifica determinata dalla tabella codici di confronto, che di solito sarà esattamente un byte per carattere (anche se ci sono eccezioni, vedi sotto). Usando due byte per carattere, è possibile memorizzare una vasta gamma di caratteri, quindi la cosa fondamentale da ricordare qui è quella nchar
e nvarchar
tendono ad essere una scelta molto migliore quando si desidera il supporto per l'internazionalizzazione, cosa che probabilmente si fa.
Ora per alcuni punti più fini.
In primo luogo, nchar
e nvarchar
le colonne sempre memorizzare i dati usando UCS-2. Ciò significa che verranno utilizzati esattamente due byte per carattere e qualsiasi carattere Unicode nel piano multilingue di base (BMP) può essere memorizzato da un campo nchar
o nvarchar
. Tuttavia, non è possibile memorizzare alcun carattere Unicode. Ad esempio, secondo Wikipedia, i punti di codice per i geroglifici egiziani non rientrano nel BMP. Vi sono, quindi, stringhe Unicode che possono essere rappresentate in UTF-8 e altre codifiche Unicode vere che non possono essere archiviate in un server nchar
o nvarchar
campo SQL , e le stringhe scritte in geroglifici egiziani sarebbero tra queste. Fortunatamente i tuoi utenti probabilmente non scrivono in quello script, ma è qualcosa da tenere a mente!
Un'altra fonte di confusione ma il punto interessante che altri utenti hanno messo in evidenza è che char
e varchar
campi possono utilizzare due byte per carattere per certi personaggi se la pagina collazione di codici richiede. (Martin Smith fornisce un eccellente esempio in cui mostra come Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS mostra questo comportamento. Dai un'occhiata.)
AGGIORNAMENTO: A partire da SQL Server 2012, ci sono finalmente le code page per UTF-16 , ad esempio Latin1_General_100_CI_AS_SC, che può davvero coprire l'intero intervallo Unicode.
char
: dati di caratteri a lunghezza fissa con una lunghezza massima di 8000 caratteri.nchar
: dati unicode a lunghezza fissa con una lunghezza massima di 4000 caratteri.Char
= Lunghezza 8 bitNChar
= Lunghezza di 16 bitchar
non poteva avere una lunghezza di 8 bit. Non deve memorizzare la lunghezza e la lunghezza fissa può contenere fino a 8000 caratteri.
nchar[(n)]
(carattere nazionale)
n
definisce la lunghezza della stringa e deve essere un valore compreso tra 1 e 4.000.n
byte.nvarchar [(n | max)]
(carattere nazionale variabile).
n
definisce la lunghezza della stringa e può essere un valore compreso tra 1 e 4.000.max
indica che la dimensione massima di archiviazione è 2 ^ 31-1 byte (2 GB).char [(n)]
(carattere)
non-Unicode
Dati di stringa a lunghezza fissa .n
definisce la lunghezza della stringa e deve essere un valore compreso tra 1 e 8.000.n
byte.varchar [(n | max)]
(carattere variabile)
n
definisce la lunghezza della stringa e può essere un valore compreso tra 1 e 8.000.max
indica che la dimensione massima di archiviazione è 2 ^ 31-1 byte (2 GB).Le differenze sono:
Un'altra differenza è la lunghezza. Sia nchar che nvarchar possono avere una lunghezza massima di 4.000 caratteri. E char e varchar possono contenere fino a 8000 caratteri. Ma per SQL Server puoi anche usare un [n] varchar (max) che può gestire fino a 2.147.483.648 caratteri. (Due gigabyte, un intero con segno a 4 byte.)
nchar richiede più spazio di nvarchar.
per esempio,
Un nchar (100) memorizzerà sempre 100 caratteri anche se inserisci solo 5, i restanti 95 caratteri saranno riempiti di spazi. La memorizzazione di 5 caratteri in un nvarchar (100) salverà 5 caratteri.
nchar (10) è una stringa Unicode a lunghezza fissa di lunghezza 10. nvarchar (10) è una stringa Unicode a lunghezza variabile con una lunghezza massima di 10. In genere, si utilizza il primo se tutti i valori dei dati sono 10 caratteri e il secondo se le lunghezze variano.
nchar è a lunghezza fissa e può contenere caratteri unicode. utilizza una memoria di due byte per carattere.
varchar è di lunghezza variabile e non può contenere caratteri unicode. utilizza una memoria byte per carattere.
UCS-2
(che risulta essere la codifica utilizzata da SQL Server) memorizza ogni carattere esattamente due byte, vedi 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 può utilizzare la compressione SCSU, ma è ancora la compressione delle stringhe Unicode codificate UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspx
NVARCHAR può memorizzare caratteri Unicode e richiede 2 byte per carattere.
nvarchar
richiede sempre 2 byte per carattere.