Domanda

È solo che nvarchar supporta i caratteri multibyte? In tal caso, c'è davvero qualche punto, oltre ai problemi di archiviazione, sull'uso di varchars ?

È stato utile?

Soluzione

Una colonna nvarchar può memorizzare qualsiasi dato Unicode. Una colonna varchar è limitata a una tabella codici a 8 bit. Alcune persone pensano che varchar dovrebbe essere usato perché occupa meno spazio. Credo che questa non sia la risposta corretta. Le incompatibilità di codepage sono una seccatura e Unicode è la cura per i problemi di codepage. Con dischi e memoria economici al giorno d'oggi, non c'è davvero alcun motivo per perdere tempo a perdere tempo con le pagine di codice.

Tutti i moderni sistemi operativi e piattaforme di sviluppo utilizzano Unicode internamente. Usando nvarchar anziché 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 sta interfacciarsi con un'applicazione che utilizza solo ASCII, consiglierei comunque di utilizzare Unicode nel database. Gli algoritmi di confronto del sistema operativo e del database funzioneranno meglio con Unicode. Unicode evita problemi di conversione quando si interfaccia con altri sistemi. E ti preparerai per il futuro. E puoi sempre convalidare che i tuoi dati sono limitati a ASCII a 7 bit per qualsiasi sistema legacy che devi mantenere, anche mentre usufruisci di alcuni dei vantaggi dell'archiviazione Unicode completa.

Altri suggerimenti

varchar : lunghezza variabile , dati di carattere non Unicode. Le regole di confronto del database determinano la tabella codici utilizzata per i dati.

nvarchar : lunghezza variabile Dati carattere Unicode. 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).

Uso sempre nvarchar in quanto consente a qualsiasi cosa io stia costruendo di resistere praticamente a tutti i dati che gli lancio. Il mio sistema CMS fa il cinese per caso, perché ho usato nvarchar. Al giorno d'oggi, qualsiasi nuova applicazione non dovrebbe preoccuparsi davvero della quantità di spazio richiesta.

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

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

VARCHAR - I dati sono archiviati nella codifica NLS_CHARACTERSET. Se ci sono altre istanze di database sullo stesso server, potresti essere limitato da esse; e viceversa, poiché è necessario condividere l'impostazione. Un tale campo può archiviare tutti i dati che possono essere codificati utilizzando 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 poche altre (come € e -). La tua applicazione sarebbe utile solo per alcune impostazioni locali, incapace di operare in qualsiasi altra parte del mondo. Per questo motivo, è considerata una cattiva idea.

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

Che dire dello spazio di archiviazione? VARCHAR è generalmente efficiente, poiché il set di caratteri / codifica è stato progettato su misura per una locale specifica. I campi NVARCHAR vengono archiviati nella codifica UTF-8 o UTF-16, basandosi sull'impostazione NLS abbastanza ironicamente. UTF-8 è molto efficiente per "Western" lingue, pur supportando le lingue asiatiche. UTF-16 è molto efficiente per le lingue asiatiche, pur continuando a supportare "occidentale" le lingue. Se sei preoccupato per lo spazio di archiviazione, scegli un'impostazione NLS per fare in modo che Oracle usi UTF-8 o UTF-16 come appropriato.

E la velocità di elaborazione? La maggior parte delle nuove piattaforme di codifica usano Unicode in modo nativo (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ì bene. L'uso di NVARCHAR evita la conversione.

In conclusione: usa NVARCHAR! Evita limitazioni e dipendenze, va bene per lo spazio di archiviazione e di solito è anche meglio per le prestazioni.

nvarchar archivia 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.

I miei due centesimi

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

  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 & nbsp; Server ha VARCHAR e NVARCHAR, un database Apache / Derby ha solo VARCHAR e lì VARCHAR è in Unicode.

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

" Unicodes " significa schema di codifica dei caratteri a 16 bit che consente di codificare i caratteri di molte altre lingue come l'arabo, l'ebraico, il cinese e il giapponese in un singolo set di caratteri.

Ciò significa che unicodes sta usando 2 byte per carattere per memorizzare e i nonunicodes usano solo un byte per carattere per memorizzare. Ciò significa che gli Unicode necessitano di una doppia capacità di archiviazione rispetto ai non Unicode.

Hai ragione. nvarchar memorizza i dati Unicode mentre varchar archivia i dati dei caratteri a byte singolo. Oltre alle differenze di archiviazione ( nvarchar richiede il doppio dello spazio di archiviazione come varchar ), che hai già menzionato, il motivo principale per preferire nvarchar rispetto a varchar sarebbe internazionalizzazione (ovvero memorizzazione di stringhe in altre lingue).

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 #), vai su nvarchar.

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

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

Se viene utilizzato un singolo byte per memorizzare un carattere, ci sono 256 possibili combinazioni e quindi è possibile salvare 256 caratteri diversi. Le regole di confronto sono il modello che definisce i personaggi e le regole con cui vengono confrontati e ordinati.

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

Unicode standard

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

SQL Server ha due categorie di tipi di dati dei caratteri:

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

Se dobbiamo salvare i dati dei personaggi da più paesi, usa sempre Unicode.

Sebbene NVARCHAR memorizzi Unicode, dovresti prendere in considerazione l'aiuto della raccolta anche tu puoi usare VARCHAR e salvare i tuoi dati nelle lingue locali.

Immagina solo il seguente scenario.

Le regole di confronto del tuo DB sono persiane e tu salvi 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 del 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, consiglierei di usare la posizione invece di usare troppi spazi.

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

Devo dire qui (mi rendo conto che probabilmente mi aprirò a una lista!), ma sicuramente l'unica volta in cui NVARCHAR è in realtà più utile (nota il più lì!) 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 delle regole di confronto deve comunque avvenire e quindi rendere VARCHAR fattibile quanto 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 non contenuti in qualcosa come un campo TEXT o NTEXT , allora VARCHAR fornisce l'intero valore di 8k di spazio mentre NVARCHAR fornisce solo 4k (raddoppia i byte, raddoppia lo spazio).

Suppongo, per riassumere, l'uso di uno dei due dipende da:

  • Progetto o contesto
  • Infrastrutture
  • Sistema di database

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

In generalenvarchar archivia 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.

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 un piccolo spazio aggiuntivo. Bene, questo non è sempre vero quando si desidera applicare un indice sulla colonna. SQL Server ha un limite di 900 byte per la dimensione del campo che è possibile indicizzare. Quindi se hai un varchar (900) puoi comunque indicizzarlo, ma non varchar (901) . Con nvarchar , il numero di caratteri viene dimezzato, quindi puoi indicizzare fino a nvarchar (450) . Quindi, se sei sicuro di non aver bisogno di nvarchar , non ti consiglio di usarlo.

In generale, nei database, consiglio di attenersi alle dimensioni necessarie, poiché è sempre possibile espandere. Ad esempio, un collega al lavoro una volta ha pensato che non ci fosse nulla di male nell'utilizzare nvarchar (max) per una colonna, poiché non abbiamo alcun problema con l'archiviazione. Successivamente, quando abbiamo provato ad applicare un indice su questa colonna, SQL Server ha rifiutato questo. Se, tuttavia, avesse iniziato anche con varchar (5) , avremmo potuto semplicemente estenderlo in seguito a ciò di cui abbiamo bisogno senza un tale problema che ci richiederebbe di fare un piano di migrazione sul campo per risolvere questo problema.

La principale differenza tra Varchar (n) e nvarchar (n) è: inserisci qui la descrizione dell'immagine

La dimensione

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

  1. Utilizzato per memorizzare caratteri non Unicode

  2. Occupa 1 byte di spazio per ogni carattere

 inserisci qui la descrizione dell'immagine

Nvarchar : dati dei caratteri Unicode a lunghezza variabile.

1.È un tipo di dati a lunghezza variabile

2. Utilizzato per memorizzare i caratteri Unicode.

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

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

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

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

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

Entrambe le persone con una reputazione così alta, cosa sceglie uno sviluppatore di database server sql di apprendimento?

Ci sono molti avvisi nelle risposte e nei commenti sui problemi di prestazione se non sei coerente nelle scelte.

Ci sono commenti pro / con nvarchar per le prestazioni.

Ci sono commenti pro / con varchar per le prestazioni.

Ho un requisito particolare 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 8060 byte del server SQL * 2012.

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

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

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

nvarchar è sicuro da usare rispetto a varchar al fine di rendere il nostro codice privo di errori (tipo non corrispondente) perché nvarchar consente anche caratteri unicode . Quando utilizziamo la condizione where nella query di SQL Server e se utilizziamo l'operatore = , alcune volte viene generato un errore. Probabilmente il motivo è che la nostra colonna di mappatura sarà definita in varchar . Se lo definissimo in nvarchar questo problema non accadrà. Rimaniamo comunque su varchar ed evitiamo questo problema, meglio usare la parola chiave LIKE anziché = .

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