it-swarm.it

Scrivi le differenze tra varchar e nvarchar

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

La mia domanda è: ci sono differenze nel modo in cui SQL Server scrive nelle colonne varchar e nvarchar? Abbiamo una serie di procedure di back-end di cui sono preoccupato.

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

65
Chris L

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:

enter image description here

51
Aaron Bertrand

La preoccupazione maggiore è che nvarchar utilizza 2 byte per carattere, mentre varchar usa 1. Pertanto, 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 colonne nvarchar 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 colonne nvarchar(max), verranno rimosse dalla riga prima di varchar(max).
  • Potrebbe essere necessario utilizzare colonne nvarchar più brevi per rimanere entro il limite della chiave di indice di 900 byte (non so perché si vorrebbe usare una chiave di indice così grande, ma non si sa mai).

Oltre a ciò, lavorare con nvarchar non è molto diverso, supponendo che il software client sia costruito per gestire Unicode. SQL Server converte in modo trasparente un varchar in nvarchar, quindi non è strettamente necessario il prefisso N per i letterali di stringa a meno che non si utilizzino caratteri a 2 byte (ovvero Unicode) nel letterale. Tieni presente che il cast di nvarchar in varbinary produce risultati diversi rispetto a 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 delle righe leggere è sufficiente, Enterprise Edition richiesta prima di SQL Server 2016 SP1 ) di solito troverai nchar e nvarchar non occupano più spazio di char e varchar, a causa di compressione Unicode (usando l'algoritmo SCSU) .

41
db2

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 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
20
rchacko

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.

0
Joseph Poirier