Domanda

Cosa si intende per nvarchar ?

Qual è la differenza tra char , nchar , varchar e nvarchar in SQL Server?

È stato utile?

Soluzione

Solo per chiarire ... o riassumere ...

  • nchar e nvarchar possono memorizzare Unicode .
  • char e varchar non possono memorizzare caratteri Unicode .
  • char e nchar sono a lunghezza fissa che riservare spazio di archiviazione per il numero di caratteri specificato anche se non si utilizza tutto quello spazio.
  • varchar e nvarchar sono a lunghezza variabile che utilizzerà solo spazi per i personaggi che memorizzi. non riserverà spazio di archiviazione come char o nchar .

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

 inserisci qui la descrizione dell

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:

  1. n [var] char memorizza unicode mentre [var] char memorizza solo caratteri a byte singolo.
  2. [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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top