risposta-alla-domanda-sullo-sviluppo-web-bd.com

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

Cosa si intende per nvarchar?

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

569
MrDatabase

Solo per chiarire ... o riassumere ...

  • nchare nvarcharpuò memorizzare Unicodecaratteri.
  • charand varcharimpossibile memorizzare Unicodecaratteri.
  • charand ncharare fixed-lengthwhich will reserve storage spaceper il numero di caratteri che specifichi anche se non usi tutto lo spazio.
  • varchare nvarcharare variable-lengthche utilizzerà solo spazi per i caratteri che si memorizzano. non riserva memoria come char o nchar.

nchar e nvarchar occuperanno il doppio dello spazio di archiviazione, quindi potrebbe essere saggio usarli solo se è necessario Unicode support.

787
Brian Kim

Tutte le risposte finora indicano che varchar è single byte, nvarchar è double 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

 enter image description here

Si noti che i caratteri e non erano ancora rappresentati nella versione VARCHAR e sono stati sostituiti silenziosamente con ?.

In realtà non ci sono ancora caratteri cinesi che possono essere riproposti da un singolo byte in quella fascicolazione. Gli unici caratteri a byte singolo sono il tipico set occidentale ASCII.

Per questo motivo è possibile che un inserto da una colonna nvarchar(X) a una varchar(X) column non riesca con un errore di troncamento (dove X denota un numero uguale in entrambe le istanze).

SQL Server 2012 aggiunge le regole di confronto SC (Carattere supplementare) che supportano UTF-16. In queste regole un singolo carattere nvarchar può richiedere 2 o 4 byte.

87
Martin Smith

nchar e char funzionano praticamente esattamente nello stesso modo in cui si trovano, così come nvarchar e varchar. L'unica differenza tra loro è che nchar/nvarchar memorizza i caratteri Unicode (essenziale 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 (ad esempio, nelle versioni precedenti di SQL Server la dimensione massima di un campo nvarchar è 4000).

Questa domanda è un duplicato di questo .

33
Luke Bennett

Solo per aggiungere qualcosa di più: nchar - aggiunge spazi finali ai dati. nvarchar - non aggiunge spazi finali ai dati.

Quindi, se si intende filtrare il set di dati con un campo "nchar", è possibile utilizzare 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 contenere: RTRIM (Fields! BRAND.Value) = "NIKE"

Spero che questo aiuti qualcuno là fuori perché stavo lottando con esso per un po 'solo ora!

32
Dimuthu

Il mio tentativo di riepilogare e correggere le risposte esistenti:

Innanzitutto, char e nchar utilizzeranno sempre una quantità fissa di spazio di archiviazione, anche quando la stringa da memorizzare è minore dello spazio disponibile, mentre varchar e nvarchar utilizzeranno solo lo spazio di archiviazione necessario per memorizzare 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 pagina di codice di confronto, che sarà solitamente essere esattamente un byte per carattere (sebbene ci siano 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 si desidera il supporto per l'internazionalizzazione, cosa che probabilmente si fa.

Ora per alcuni punti più fini.

Innanzitutto, nchar e nvarchar colonne sempre memorizzano i dati utilizzando UCS-2. Ciò significa che verranno utilizzati esattamente due byte per carattere e qualsiasi carattere Unicode nel BMP (Basic Multilingual Plane) di base può essere memorizzato da un campo nchar o nvarchar. Tuttavia, non è possibile che any carattere Unicode possa essere memorizzato. 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 memorizzate in un campo nchar o nvarchar di SQL Server e che 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 altro punto di confusione ma interessante che altri poster hanno evidenziato è che i campi char e varchar possono usare due byte per carattere per determinati caratteri se la codepage di regole di confronto lo richiede. (Martin Smith fornisce un eccellente esempio in cui mostra come Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS esibisce questo comportamento. Controllalo.)

UPDATE: A partire da SQL Server 2012, esistono infine code page per UTF-16 , ad esempio Latin1_General_100_CI_AS_SC, che può veramente coprire l'intero intervallo Unicode.

22
PeterAllenWebb
  • char: dati carattere a lunghezza fissa con una lunghezza massima di 8000 caratteri.
  • nchar: dati unicode a lunghezza fissa con una lunghezza massima di 4000 caratteri.
  • Char = 8 bit di lunghezza
  • NChar = 16 bit di lunghezza
14
ss.

nchar[(n)](carattere nazionale)

  • Fixed-length Unicode string data.
  • n definisce la lunghezza della stringa e deve essere un valore compreso tra 1 e 4.000.
  • La dimensione di archiviazione è due volte n byte.

nvarchar [(n | max)](carattere nazionale che varia).

  • Lunghezza variabile Unicode stringa di dati.
  • n definisce la lunghezza della stringa e può essere un valore compreso tra 1 e 4.000.
  • max indica che la dimensione massima della memoria è 2 ^ 31-1 byte (2 GB).
  • La dimensione di archiviazione, in byte, è due volte la lunghezza effettiva dei dati immessi + 2 byte

char [(n)](carattere)

  • Dati stringa non-Unicode a lunghezza fissa.
  • 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 che varia)

  • Dati a lunghezza variabile, non Unicode stringa.
  • n definisce la lunghezza della stringa e può essere un valore compreso tra 1 e 8.000.
  • max indica che la dimensione massima della memoria è 2 ^ 31-1 byte (2 GB).
  • La dimensione di archiviazione è la lunghezza effettiva dei dati immessi + 2 byte.
9

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 a includere la lunghezza definita.

Un'altra differenza è la lunghezza. Sia nchar che nvarchar possono avere una lunghezza massima di 4000 caratteri. E char e varchar possono avere una lunghezza massima di 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).

7
Wim ten Brink

nchar richiede più spazio di nvarchar.

per esempio,

Un char (100) memorizzerà sempre 100 caratteri anche se inserisci solo 5, i rimanenti 95 caratteri saranno riempiti con spazi. Memorizzando 5 caratteri in un varchar (100) si salveranno 5 caratteri.

7
Sunil

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 utilizzerà il primo se tutti i valori dei dati sono 10 caratteri e quest'ultimo se le lunghezze variano.

5
Jason Kresowaty
  • nchar è di lunghezza fissa e può contenere caratteri unicode. utilizza due byte di memoria per carattere.

  • varchar è di lunghezza variabile e non può contenere caratteri Unicode. utilizza una memoria di byte per carattere.

4
Manu

NVARCHARpuò memorizzare caratteri Unicode e richiede 2 byte per carattere.

1
Gustavo Rubio