Qual è la differenza tra char, nchar, varchar e nvarchar in SQL Server?
-
05-07-2019 - |
Domanda
Cosa si intende per nvarchar
?
Qual è la differenza tra char
, nchar
, varchar
e nvarchar
in SQL Server?
Soluzione
Solo per chiarire ... o riassumere ...
nchar
envarchar
possono memorizzare Unicode .char
evarchar
non possono memorizzare caratteri Unicode .char
enchar
sono a lunghezza fissa che riservare spazio di archiviazione per il numero di caratteri specificato anche se non si utilizza tutto quello spazio.varchar
envarchar
sono a lunghezza variabile che utilizzerà solo spazi per i personaggi che memorizzi. non riserverà spazio di archiviazione comechar
onchar
.
nchar
e nvarchar
occuperanno il doppio dello spazio di archiviazione, quindi potrebbe essere saggio usarli solo se hai bisogno del supporto Unicode .
Altri suggerimenti
Tutte le risposte finora indicano che varchar
è a byte singolo, nvarchar
è a doppio byte. In realtà la prima parte di questo 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
I ritorni
Nota che i caratteri ?
e ?
non erano ancora rappresentati nella versione VARCHAR
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 per un inserimento da una colonna nvarchar (X)
a una colonna varchar (X)
fallire 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 carattere nvarchar
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 è 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 è un duplicato di questo .
Solo per aggiungere qualcosa di più: nchar : aggiunge spazi finali ai dati. nvarchar - non aggiunge spazi finali ai dati.
Quindi, se hai intenzione di filtrare il tuo set di dati in base a un campo 'nchar', potresti voler usare RTRIM per rimuovere gli spazi. Per 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 per un po 'adesso!
Il mio tentativo di riassumere e correggere le risposte esistenti:
Innanzitutto, char
e nchar
utilizzeranno 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 è che nchar
e nvarchar
memorizzano le stringhe usando esattamente due byte per carattere, mentre char
e varchar
usano una codifica determinata dalla codepage, 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 è che nchar
e nvarchar
tendono ad essere una scelta molto migliore quando vuoi il supporto per l'internazionalizzazione, cosa che probabilmente fai.
Ora per alcuni punti più fini.
Innanzitutto, nchar
e nvarchar
le colonne sempre memorizzano i dati utilizzando 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 in un campo nchar
o nvarchar
. Tuttavia, non è possibile memorizzare qualsiasi carattere Unicode. Ad esempio, secondo Wikipedia, i punti di codice per i geroglifici egiziani non rientrano nel BMP. Esistono quindi stringhe Unicode che possono essere rappresentate in UTF-8 e altre codifiche Unicode vere che non possono essere archiviate in un campo nchar
o nvarchar
di SQL Server e stringhe scritte nei geroglifici egiziani sarebbe tra questi. Fortunatamente i tuoi utenti probabilmente non scrivono in quello script, ma è qualcosa da tenere a mente!
Un altro punto confuso ma interessante che altri manifesti hanno messo in evidenza è che i campi char
e varchar
possono utilizzare due byte per carattere per determinati caratteri se la tabella codici di confronto lo 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 codice pagine per UTF-16 , ad esempio Latin1_General_100_CI_AS_SC, che può davvero coprire l'intera gamma 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 bit -
NChar
= lunghezza di 16 bit
nchar[(n)×
(carattere nazionale)
- dati stringa Unicode di lunghezza fissa.
-
n
definisce la lunghezza della stringa e deve essere un valore compreso tra 1 e 4.000. - La dimensione della memoria è due volte
n
byte.
nvarchar [(n | max)]
(carattere nazionale variabile).
- Dati stringa Unicode di lunghezza 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). - La dimensione della memoria, in byte, è due volte la lunghezza effettiva dei dati immessi + 2 byte
char [(n)]
(carattere)
- dati stringa di lunghezza fissa,
non Unicode
. -
n
definisce la lunghezza della stringa e deve essere un valore compreso tra 1 e 8.000. - La dimensione di archiviazione è
n
byte.
varchar [(n | max)]
(carattere variabile)
- dati stringa di lunghezza variabile, non Unicode .
-
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). - La dimensione della memoria è la lunghezza effettiva dei dati immessi + 2 byte.
Le differenze sono:
- n [var] char memorizza unicode mentre [var] char memorizza solo caratteri a byte singolo.
- [n] char richiede un numero fisso di caratteri della lunghezza esatta mentre [n] varchar accetta un numero variabile di caratteri fino alla lunghezza definita inclusa.
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 carattere (100) memorizzerà sempre 100 caratteri anche se si immette solo 5, il i restanti 95 caratteri saranno riempiti con spazi. La memorizzazione di 5 caratteri in un varchar (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 la prima se tutti i valori dei dati sono 10 caratteri e quest'ultimo 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 di byte per carattere.
NVARCHAR può memorizzare caratteri Unicode e richiede 2 byte per carattere.