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

Qual è la differenza tra varchar e nvarchar?

È solo che nvarchar supporta i caratteri multibyte? Se questo è il caso, c'è davvero qualche punto, oltre ai problemi di archiviazione, nell'usare varchars?

1267
stimms

Una colonna nvarchar può memorizzare qualsiasi dato Unicode. Una colonna varchar è limitata a una codepage a 8 bit. Alcune persone pensano che dovrebbe essere usato varchar perché occupa meno spazio. Credo che questa non sia la risposta corretta. Le incompatibilità della codepage sono un problema, e Unicode è la cura per i problemi di codepage. Oggigiorno con il disco e la memoria a basso costo, non c'è più alcun motivo per perdere tempo con le code page.

Tutti i moderni sistemi operativi e piattaforme di sviluppo utilizzano internamente Unicode. Usando nvarchar piuttosto che varchar, puoi evitare di fare conversioni di codifica ogni volta che leggi o scrivi sul database. Le conversioni richiedono tempo e sono soggette a errori. E il recupero dagli errori di conversione è un problema non banale.

Se si interfaccia con un'applicazione che utilizza solo ASCII, si consiglia comunque di utilizzare Unicode nel database. Gli algoritmi di confronto del sistema operativo e del database funzioneranno meglio con Unicode. Unicode evita i problemi di conversione quando si interfaccia con altri sistemi. E ti starai preparando per il futuro. E puoi sempre verificare che i tuoi dati siano limitati a _-ASCII _ _ per qualsiasi sistema legacy che devi mantenere, anche se godi alcuni dei vantaggi dell'archiviazione Unicode completa.

1538

varchar : dati di carattere di lunghezza variabile, non Unicode. Le regole di confronto del database determinano la tabella codici in cui i dati vengono archiviati utilizzando.

nvarchar : dati carattere Unicode a lunghezza variabile. Dipende dalle regole di confronto del database per i confronti.

Armati di questa conoscenza, usa quello che corrisponde ai tuoi dati di input (ASCII v. Unicode).

237
user7116

Io uso sempre nvarchar in quanto consente a qualsiasi cosa sto costruendo di sopportare praticamente tutti i dati che gli lancio. Il mio sistema CMS fa il cinese per caso, perché ho usato nvarchar. In questi giorni, qualsiasi nuova applicazione non dovrebbe preoccuparsi della quantità di spazio richiesta.

63
tags2k

Dipende da come è stato installato Oracle. Durante il processo di installazione, l'opzione NLS_CHARACTERSET è impostata. Potresti riuscire a trovarlo con la query SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

Se il tuo NLS_CHARACTERSET è una codifica Unicode come UTF8, ottimo. L'uso di VARCHAR e NVARCHAR è praticamente identico. Smetti di leggere ora, vai e basta. Altrimenti, o se non hai il controllo sul set di caratteri Oracle, continua a leggere.

VARCHAR - I dati sono memorizzati nella codifica NLS_CHARACTERSET. Se ci sono altre istanze di database sullo stesso server, potresti essere limitato da esse; e viceversa, dal momento che devi condividere l'impostazione. Un campo di questo tipo può memorizzare tutti i dati che possono essere codificati usando quel set di caratteri, e nient'altro . Ad esempio, se il set di caratteri è MS-1252, è possibile memorizzare solo caratteri come lettere inglesi, una manciata di lettere accentate e pochi altri (come € e -). La tua applicazione sarebbe utile solo per alcuni locali, incapace di operare in qualsiasi altra parte del mondo. Per questo motivo, è considerato una cattiva idea.

NVARCHAR - I dati sono memorizzati in una codifica Unicode. Ogni lingua è supportata. Una buona idea.

E lo spazio di archiviazione? VARCHAR è generalmente efficiente, poiché la serie di caratteri/codifica è stata progettata su misura per una locale specifica. I campi di NVARCHAR memorizzano nella codifica UTF-8 o UTF-16, basandosi ironicamente sull'impostazione NLS. UTF-8 è molto efficiente per le lingue "occidentali", pur continuando a supportare le lingue asiatiche. UTF-16 è molto efficiente per le lingue asiatiche, pur continuando a supportare le lingue "occidentali". Se preoccupati dello spazio di archiviazione, scegli un'impostazione NLS per fare in modo che Oracle usi UTF-8 o UTF-16 come appropriato.

Che dire della velocità di elaborazione? La maggior parte delle nuove piattaforme di codifica usano nativamente Unicode (Java, .NET, anche C++ std :: wstring di anni fa!) Quindi se il campo del database è VARCHAR costringe Oracle a convertire tra set di caratteri su ogni lettura o scrittura, non così buono. L'uso di NVARCHAR evita la conversione.

Conclusione: usa NVARCHAR! Evita limitazioni e dipendenze, va bene per lo spazio di archiviazione e di solito è anche il migliore per le prestazioni.

28
Jeremy Frank

nvarchar memorizza i dati come Unicode, quindi, se hai intenzione di archiviare dati multilingue (più di una lingua) in una colonna di dati, hai bisogno della variante N.

16
albertein

I miei due centesimi

  1. Gli indici possono fallire quando non si utilizzano i tipi di dati corretti:
    In SQL Server: quando si dispone di un indice su una colonna VARCHAR e si presenta una stringa Unicode, SQL Server non utilizza l'indice. La stessa cosa accade quando si presenta un BigInt a una colonna indicizzata contenente SmallInt. Anche se BigInt è abbastanza piccolo da essere un SmallInt, SQL Server non è in grado di utilizzare l'indice. Il contrario non ha questo problema (quando si fornisce SmallInt o Ansi-Code ad una colonna BigInt o NVARCHAR indicizzata).

  2. I tipi di dati possono variare tra diversi DBMS (DataBase Management System):
    Sappi che ogni database ha tipi di dati leggermente diversi e VARCHAR non significa lo stesso ovunque. Mentre SQL Server ha VARCHAR e NVARCHAR, un database Apache/Derby ha solo VARCHAR e lì VARCHAR è in Unicode.

13
incomudro

Principalmente nvarchar memorizza i caratteri Unicode e varchar memorizza i caratteri non Unicode.

"Unicode" indica uno schema di codifica dei caratteri a 16 bit che consente di codificare caratteri in molti altri linguaggi, come arabo, ebraico, cinese, giapponese, in un unico set di caratteri.

Ciò significa che unicodes utilizza 2 byte per carattere per memorizzare e nonunicodes utilizza solo un byte per carattere da memorizzare. Il che significa che gli unicode richiedono una doppia capacità di memorizzazione rispetto ai non Unicode.

12
ranjit pawar

Direi, dipende.

Se sviluppi un'applicazione desktop, in cui il sistema operativo funziona in Unicode (come tutti gli attuali sistemi Windows) e il linguaggio supporta nativamente Unicode (le stringhe predefinite sono Unicode, come in Java o C #), quindi vai su nvarchar.

Se sviluppi un'applicazione web, in cui le stringhe arrivano come UTF-8 e la lingua è PHP, che ancora non supporta Unicode in modo nativo (nelle versioni 5.x), allora varchar sarà probabilmente una scelta migliore.

9
sleepy012

Hai ragione. nvarchar memorizza i dati Unicode mentre varchar memorizza i dati dei caratteri a byte singolo. A parte le differenze di archiviazione (nvarchar richiede il doppio dello spazio di archiviazione come varchar), che hai già menzionato, il motivo principale per preferire nvarchar su varchar sarebbe l'internazionalizzazione (cioè memorizzare stringhe in altre lingue).

9
Mike Spross

Sebbene NVARCHAR memorizzi Unicode, dovresti considerare l'aiuto di regole di confronto anche tu puoi usare VARCHAR e salvare i tuoi dati delle tue lingue locali.

Immagina il seguente scenario.

Le regole di confronto del DB sono persiane e si salva un valore come "علی" (scrittura persiana di ALi) nel tipo di dati VARCHAR(10). Non ci sono problemi e il DBMS utilizza solo tre byte per memorizzarlo.

Tuttavia, se si desidera trasferire i dati su un altro database e vedere il risultato corretto, il database di destinazione deve avere le stesse regole di confronto della destinazione che è persiana in questo esempio.

Se le regole di confronto dei target sono diverse, vengono visualizzati alcuni punti interrogativi (?) Nel database di destinazione.

Infine, ricorda che se stai usando un enorme database che è per l'uso della tua lingua locale, ti consiglio di usare la posizione invece di usare troppi spazi.

Credo che il design possa essere diverso. Dipende dall'ambiente su cui lavori.

6
Ali Elmi

Se si utilizza un singolo byte per memorizzare un carattere, ci sono 256 combinazioni possibili, e quindi è possibile salvare 256 caratteri diversi. La collazione è lo schema che definisce i personaggi e le regole con cui vengono confrontati e ordinati.

1252, che è il Latin1 (ANSI), è il più comune. Anche i set di caratteri a byte singolo sono inadeguati per memorizzare tutti i caratteri utilizzati da molte lingue. Ad esempio, alcune lingue asiatiche hanno migliaia di caratteri, quindi devono utilizzare due byte per carattere.

Standard Unicode

Quando i sistemi che utilizzano più code page vengono utilizzati in una rete, diventa difficile gestire la comunicazione. Per standardizzare le cose, il consorzio ISO e Unicode ha introdotto il Unicode . Unicode utilizza due byte per memorizzare ciascun carattere. Sono 65.536 caratteri diversi, quindi quasi tutti i personaggi possono essere coperti con Unicode. Se due computer utilizzano Unicode, ogni simbolo verrà rappresentato allo stesso modo e non è necessaria alcuna conversione: questa è l'idea alla base di Unicode.

SQL Server ha due categorie di tipi di dati carattere:

  • non Unicode (char, varchar e text)
  • Unicode (nchar, nvarchar e ntext)

Se è necessario salvare i dati carattere da più paesi, utilizzare sempre Unicode.

6
Jithin Shaji

nVarchar ti aiuterà a memorizzare i caratteri Unicode. È la strada da percorrere se si desidera memorizzare i dati localizzati.

6
Vijesh VP

Devo dire qui (mi rendo conto che probabilmente mi aprirò ad una lista!), Ma sicuramente l'unica volta in cui NVARCHAR è in realtà più utile (notare il more there!) rispetto a VARCHAR è quando tutte le regole di confronto su tutti i sistemi dipendenti e all'interno del database stesso sono uguali ...? In caso contrario, la conversione della collazione deve avvenire comunque e pertanto rende VARCHAR altrettanto valido come NVARCHAR.

Per aggiungere a questo, alcuni sistemi di database, come SQL Server (prima del 2012) hanno una dimensione della pagina di ca. 8 MILA. Quindi, se stai cercando di archiviare dati ricercabili che non sono contenuti in un campo TEXT o NTEXT allora VARCHAR fornisce il valore completo di 8k di spazio mentre NVARCHAR fornisce solo 4k (il doppio dei byte, il doppio dello spazio).

Suppongo, per riassumere, l'uso di entrambi dipende da:

  • Progetto o contesto
  • Infrastruttura
  • Sistema di database
5
Paul

Ho dato un'occhiata alle risposte e molti sembrano raccomandare di usare nvarchar su varchar, perché lo spazio non è più un problema, quindi non c'è nulla di male nell'abilitare Unicode per poca memoria extra. Bene, questo non è sempre vero quando vuoi applicare un indice sulla tua colonna. SQL Server ha un limite di 900 byte sulla dimensione del campo che è possibile indicizzare. Quindi se hai un varchar(900) puoi ancora indicizzarlo, ma non varchar(901). Con nvarchar, il numero di caratteri è dimezzato, quindi puoi indicizzare fino a nvarchar(450). Quindi, se sei sicuro di non aver bisogno di nvarchar, non è consigliabile utilizzarlo.

In generale, nei database, consiglio di attenersi alle dimensioni necessarie, perché è sempre possibile espandere. Ad esempio, un collega al lavoro una volta pensava che non ci fosse alcun danno nell'usare nvarchar(max) per una colonna, poiché non abbiamo alcun problema con lo spazio di archiviazione. Successivamente, quando abbiamo tentato di applicare un indice su questa colonna, SQL Server lo ha respinto. Se, tuttavia, ha iniziato con varchar(5), avremmo potuto semplicemente ampliarlo in seguito a ciò di cui abbiamo bisogno senza un tale problema che ci richiederà di fare un piano di migrazione sul campo per risolvere questo problema.

5
Rafid

Follow Differenza tra SQUILE Server VARCHAR e NVARCHAR Tipo di dati. Qui puoi vedere in modo molto descrittivo.

In generalnvarchar memorizza i dati come Unicode, quindi, se hai intenzione di archiviare dati multilingue (più di una lingua) in una colonna di dati, hai bisogno della variante N.

5

La principale differenza tra Varchar(n) e nvarchar(n) è: enter image description here

Varchar (Dati di caratteri a lunghezza variabile, non Unicode) è fino a 8000. 1.È un tipo di dati di lunghezza variabile

  1. Utilizzato per memorizzare caratteri non Unicode

  2. Occupa 1 byte di spazio per ogni personaggio

enter image description here

Nvarchar: dati carattere Unicode a lunghezza variabile.

1.È un tipo di dati a lunghezza variabile

2. Utilizzato per memorizzare caratteri Unicode.

  1. I dati sono memorizzati in una codifica Unicode. Ogni lingua è supportata. (ad esempio le lingue arabo, tedesco, hindi, ecc. ecc.)
4
Debendra Dash

Jeffrey L Whitledge con punteggio di ~ 47000 reputazione raccomanda l'uso di nvarchar

Solomon Rutzky con il punteggio di ~ 33200 reputazione raccomanda: NON utilizzare sempre NVARCHAR. Questo è un atteggiamento/approccio molto pericoloso e spesso costoso.

Quali sono le principali differenze di prestazioni tra i tipi di dati di SQL Server varchar e nvarchar?

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

Entrambe le persone di così alta reputazione, cosa sceglie uno sviluppatore di database di SQL Server?

Ci sono molti avvertimenti in risposte e commenti su problemi di prestazioni se non si è coerenti nelle scelte.

Ci sono commenti pro/con nvarchar per le prestazioni.

Ci sono commenti pro/con varchar per le prestazioni.

Ho un particolare requisito per una tabella con molte centinaia di colonne, che di per sé è probabilmente insolita?

Sto scegliendo varchar per evitare di avvicinarmi al limite della dimensione del record della tabella di byte 8060 di SQL * server 2012.

L'uso di nvarchar, per me, supera questo limite di 8060 byte.

Sto anche pensando che dovrei abbinare i tipi di dati delle tabelle di codice relative ai tipi di dati della tabella centrale primaria.

Ho visto l'uso della colonna varchar in questo luogo di lavoro, il governo del Sud Australia, da precedenti esperti sviluppatori di database, dove il conteggio delle righe della tabella sarà di diversi milioni o più (e pochissime colonne nvarchar, se presenti, in questi molto grandi tabelle), quindi forse i volumi delle righe di dati previsti diventano parte di questa decisione.

1
Allan F

nvarchar è sicuro da usare rispetto a varchar per rendere il nostro codice privo di errori (tipo mismatching) perché nvarchar consente anche caratteri unicode. Quando usiamo la condizione where nella query di SQL Server e se usiamo l'operatore =, verrà generato un errore alcune volte. Probabile ragione per questo è la nostra colonna di mappatura sarà ridotta in varchar. Se lo abbiamo definito in nvarchar questo problema, non succede. Ancora ci atteniamo a varchar ed evitiamo questo problema, meglio usare LIKE key Word piuttosto che =.

0
Rinoy Ashokan