2009-08-13 12 views
11

Sto memorizzando nome e cognome con un massimo di 30 caratteri ciascuno. Quale è meglio varchar o nvarchar.varchar o nvarchar

Ho letto che lo nvarchar occupa il doppio dello spazio rispetto a varchar e che lo standard nvarchar viene utilizzato per l'internazionalizzazione.

Quindi, cosa suggerisci di utilizzare: nvarchar o varchar?

Inoltre, fatemi sapere le prestazioni di entrambi. Le prestazioni per entrambi sono uguali o differiscono in termini di prestazioni. Perché lo spazio non è un problema troppo grande. Il problema è la performance.

+1

http://stackoverflow.com/questions/35366/varchar-vs-nvarchar-performance –

risposta

17

Fondamentalmente, nvarchar significa che puoi gestire molti alfabeti, non solo l'inglese regolare. Tecnicamente, significa supporto Unicode, non solo ANSI. Ciò significa caratteri a larghezza doppia o circa il doppio dello spazio. In questi giorni lo spazio su disco è così economico che potresti usare nvarchar fin dall'inizio piuttosto che passare attraverso il dolore di dover cambiare durante la vita di un prodotto.

Se sei certo che avrai solo bisogno di supportare una lingua che potresti attaccare con varchar, altrimenti andrei con nvarchar.

Questo è stato discusso in SO prima dello here.

MODIFICATO: cambiato ASCII in ANSI come indicato nel commento.

+3

essendo nitpicky: in realtà, VARCHAR memorizza i dati ANSI - 8-bit, in genere basati su una tabella codici come Europa occidentale o islandese o qualsiasi altra cosa ti serva :-) È ANSI - 8-bit - non ASCII (= 7-bit) –

6

Prima di tutto, per chiarire, nvarchar memorizza i dati unicode mentre varchar memorizza dati ANSI (8 bit). Funzionano in modo identico ma nvarchar occupa il doppio dello spazio.

In genere, preferisco memorizzare i nomi utente utilizzando i tipi di dati varchar a meno che tali nomi non contengano caratteri che non rientrano nel limite dei caratteri che possono essere memorizzati da varchar.

Dipende anche dalle regole di confronto del database. Ad es. non sarà possibile memorizzare i caratteri russi in un campo varchar, se le regole di confronto del database sono LATIN_CS_AS. Tuttavia, se si sta lavorando a un'applicazione locale, che verrà utilizzata solo in Russia, si imposteranno le regole di confronto del database in russo. Ciò che questo farà è che ti permetterà di inserire caratteri russi in un campo varchar, risparmiando un po 'di spazio.

Ma, oggigiorno, la maggior parte delle applicazioni in fase di sviluppo sono internazionali, quindi dovrai decidere tu stesso quali utenti dovranno registrarsi e in base a ciò decidere il tipo di dati.

2

Ho rosso che nvarchar richiede due volte come varchar.

Sì.

nvarchar è utilizzato per l'internazionalizzazione.

Sì.

cosa suggerisci di utilizzare nvarchar o varchar?

Dipende dall'applicazione.

+1

Non corretto. Un nvarchar ha bisogno di due volte più spazio di un varchar. Puoi facilmente controllarlo usando la funzione DATALENGTH. – Guffa

+0

Grazie Kirtan. Mi scuso per l'inconveniente causato. – adatapost

1

Per impostazione predefinita, andare con nvarchar. Ci sono pochi motivi per andare con varchar in questi giorni, e ogni ragione per andare con nvarchar (consente i caratteri internazionali, come discusso).

1

varchar è 1 byte per carattere, nvarchar è 2 byte per carattere.

Si utilizzerà più spazio con nvarchar ma ci sono molti altri caratteri consentiti. Lo spazio extra è trascurabile, ma potresti perdere quei personaggi in più in futuro. Anche se non ti aspetti di richiedere l'internazionalizzazione, le persone spesso hanno caratteri non inglesi (ad esempio é, ñ o ö) nei loro nomi.

Ti suggerisco di utilizzare nvarchar.

0

Il tipo nvarchar è Unicode, quindi è in grado di gestire praticamente qualsiasi carattere esistente in ogni lingua del pianeta. I caratteri sono memorizzati come UTF-16 o UCS-2 (non sono sicuro quale e le differenze sono sottili), quindi ogni carattere usa due byte.

Il tipo varchar utilizza un set di caratteri a 8 bit, quindi è limitato ai 255 caratteri del set di caratteri scelto per il campo. Ci sono diversi set di caratteri che gestiscono diversi gruppi di caratteri, quindi in genere è sufficiente per il testo locale in un paese o in una regione.

Se varchar funziona per quello che vuoi fare, dovresti usarlo. È un po 'meno dati, quindi nel complesso è leggermente più veloce. Se hai bisogno di gestire un'ampia varietà di personaggi, usa nvarchar.

1

devo rossa che nvarchar richiede il doppio del varchar

Sì. Secondo Microsoft: "La dimensione di archiviazione, in byte, è due volte il numero di caratteri immessi + 2 byte" (http://msdn.microsoft.com/en-us/library/ms186939(SQL.90).aspx).

Ma lo spazio è economico; Non mi preoccupo mai di alcuni byte in più.

Inoltre, risparmiatevi problemi in futuro e impostate le larghezze massime su qualcosa di più generoso, come 100 caratteri. Non vi è assolutamente alcun sovraccarico di memoria su questo quando si utilizza varchar o nvarchar (diversamente da char/nchar). Non si sa mai quando incontrerete un cognome a tripla canna o un nome straniero lungo che superi i 30 caratteri.

nvarchar è utilizzato per l'internazionalizzazione.

nvarchar può memorizzare qualsiasi carattere unicode, ad esempio caratteri di script non latini (arabo, cinese, ecc.). Non sono sicuro di come la tua applicazione prenderà i dati (tramite il web, tramite un toolkit GUI, ecc.) Ma è probabile che qualunque tecnologia tu stia usando supporta unicode out of the box. Ciò significa che per tutti i dati immessi dall'utente (come il nome) c'è sempre la possibilità di ricevere caratteri non latini, se non ora in futuro.

Se stavo creando una nuova applicazione, userei nvarchar. Chiamalo "a prova di futuro" se vuoi.

0

sulle prestazioni:
una ragione per usare varchar oltre nvarchar è che si può avere il doppio di molti personaggi gli indici! chiavi di indice sono limitati a 900 byte
sull'usabilità:
se la domanda è sempre e solo destinato ad un pubblico inglese & contengono nomi inglesi, uso varchar

+0

Mai incontrato un indice più lungo di 450 caratteri. – zszep

0

dati da memorizzare: "Sunil"

varchar (5) richiede 7B nvarchar (5) richiede 12B

Problemi correlati