Scrivi le differenze tra varchar e nvarchar


59

Attualmente nel nostro database SQL Server 2012, stiamo usando varchare vorremmo cambiarlo nvarchar. Ho generato una sceneggiatura per farlo.

La mia domanda è: ci sono differenze nel modo in cui SQL Server scrive su varcharcolonne o nvarcharcolonne? Abbiamo una serie di procedure di back-end di cui sono preoccupato.

Modifica:
non sono sicuro se questo aiuta, ma le colonne non hanno indici, f / k o vincoli su di essi.


Risposte:


46

Devi essere sicuro di avere il prefisso letterale stringa Unicode con un prefisso N. Ad esempio, funzioneranno diversamente se il tipo di dati sottostante è NVARCHAR:

CREATE TABLE dbo.t(c NVARCHAR(32));

INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';

SELECT c FROM dbo.t;

SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';

risultati:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?

c
----
រៀន

Per quelli su dispositivi mobili o browser decrepiti che mostrano caratteri box anziché caratteri Unicode reali, ecco come appare:

inserisci qui la descrizione dell'immagine


37

La preoccupazione maggiore è che nvarcharutilizza 2 byte per carattere, mentre varcharutilizza 1. Quindi, nvarchar(4000)utilizza la stessa quantità di spazio di archiviazione di varchar(8000)*.

Oltre a tutti i dati dei tuoi personaggi che richiedono il doppio dello spazio di archiviazione, ciò significa anche:

  • Potrebbe essere necessario utilizzare nvarcharcolonne più brevi per mantenere le righe entro il limite di riga di 8060 byte / limite di colonna di caratteri di 8000 byte.
  • Se stai usando le nvarchar(max)colonne, verranno rimosse dalla riga prima del previsto varchar(max).
  • Potrebbe essere necessario utilizzare nvarcharcolonne più brevi per rimanere entro il limite della chiave di indice di 900 byte (non so perché si vorrebbe utilizzare una chiave di indice così grande, ma non si sa mai).

Oltre a ciò, lavorare con nvarcharnon è molto diverso, supponendo che il software client sia costruito per gestire Unicode. SQL Server eseguirà l'upgrade in modo trasparente varchara nvarchar, quindi non è strettamente necessario il prefisso N per i valori letterali di stringa a meno che non si utilizzino caratteri a 2 byte (ovvero Unicode) nel valore letterale. Essere consapevoli del fatto che la fusione nvarchara varbinaryrendimenti diversi risultati di fare lo stesso con varchar. Il punto importante è che non dovrai cambiare immediatamente ogni letterale varchar in letterale nvarchar per far funzionare l'applicazione, il che aiuta a facilitare il processo.

* Se si utilizza la compressione dei dati (la compressione della riga leggera è sufficiente, Enterprise Edition richiesta prima di SQL Server 2016 SP1 ) di solito non si trova nchare occupa nvarcharpiù spazio di chare varchar, a causa della compressione Unicode (utilizzando l'algoritmo SCSU) .


17

Pensa che le seguenti siano le principali differenze:

  1. Nvarchar memorizza i dati UNICODE. Se hai requisiti per archiviare UNICODE o dati multilingue, nvarchar è la scelta. Varchar memorizza i dati ASCII e dovrebbe essere il tipo di dati scelto per l'uso normale.
  2. Per quanto riguarda l'utilizzo della memoria, nvarchar utilizza 2 byte per carattere, mentre varchar utilizza 1.
  3. L'adesione di un VARCHAR a NVARCHAR ha un notevole successo in termini di prestazioni.
  4. Potrebbe essere necessario un prefisso N quando si inseriscono i dati: INSERT dbo.t (c) SELECT N'ʤ ʥ ʦ ʧ ʨ ';
  5. Alcuni esperti raccomandano nvarchar sempre perché: poiché tutti i moderni sistemi operativi e piattaforme di sviluppo usano Unicode internamente, usando nvarchar anziché varchar, eviterai di codificare le conversioni ogni volta che leggi o scrivi sul database

0

nvarchar era richiesto per la replica di tipo merge RDP da un DB mobile a SQL Server 2005. Anche LTrim (), RTrim () e Trim () venivano usati molto perché nvarchar non tagliava automaticamente () gli spazi dalla registrazione dei dati, mentre Varchar lo faceva .

Non so se sia cambiato o meno negli ultimi anni, ma nvarchar è ora lo standard utilizzato per gli accessi al sito Web .NET Simple Membership su VS Pro 2017 utilizzati nel database generato.


-3

Se si utilizza NVarchar su Varchar e non è necessario supportare MULTI-LINQUAL, si aumenta lo spazio di archiviazione per DB, backup (locale e fuori sede). I database moderni dovrebbero supportare entrambi e tutti gli hit di conversione dovrebbero essere considerati nella progettazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.