nchar e nvarchar (Transact-SQL)

Si applica a: SQL Server Azure SQL DatabaseIstanza gestita di SQL di Azure Azure SynapseAnalytics AnalyticsPlatform System (PDW)

Tipi di dati character a dimensione fissa nchar o a dimensione variabile nvarchar. A partire da SQL Server 2012 (11.x), quando si usano regole di confronto abilitate per i caratteri supplementari (SC), questi tipi di dati archiviano l'intera gamma dei dati di tipo carattere Unicode e usano la codifica dei caratteri UTF-16. Se si specificano regole di confronto non SC, questi tipi di dati archiviano solo il subset di dati di tipo carattere supportati dalla codifica dei caratteri UCS-2.

Argomenti

nchar [ ( n ) ]

Dati stringa a dimensione fissa. n definisce le dimensioni della stringa in coppie byte e deve essere un valore compreso tra 1 e 4.000. Le dimensioni di archiviazione, espresse in byte, sono pari al doppio di n. Per la codifica UCS-2, le dimensioni di archiviazione sono pari al doppio di n byte e anche il numero di caratteri che possono essere archiviati è n. Per la codifica UTF-16, le dimensioni di archiviazione sono ancora due volte n byte, ma il numero di caratteri che può essere archiviato può essere minore di n perché i caratteri supplementari usano due coppie di byte (anche denominata coppia surrogata). I sinonimi ISO per nchar sono national char e national character.

nvarchar [ ( n | max ) ]

Dati stringa a dimensione variabile. n definisce le dimensioni della stringa in coppie byte e può essere un valore compreso tra 1 e 4.000. max indica che la dimensione di archiviazione massima è di 2^31-1 caratteri (2 GB). Le dimensioni di archiviazione, espresse in byte, sono pari al doppio di n byte + 2 byte. Per la codifica UCS-2, le dimensioni di archiviazione sono pari al doppio di n byte + 2 byte e anche il numero di caratteri che possono essere archiviati è n. Per la codifica UTF-16, le dimensioni di archiviazione sono ancora due volte n byte + 2 byte, ma il numero di caratteri che possono essere archiviati può essere minore di n perché i caratteri supplementari usano due coppie di byte (anche denominate surrogate-pair). I sinonimi ISO per nvarchar sono national char varying e national character varying.

Commenti

Un errore comune consiste nel pensare che con nchar(n) e nvarchar(n), n definisce il numero di caratteri. Tuttavia, in nchar(n) e nvarchar(n), n definisce la lunghezza della stringa in coppie di byte (0-4.000). n non definisce mai il numero di caratteri che è possibile archiviare, È simile alla definizione di char(n) e varchar(n).

L'errore si verifica perché quando si usano caratteri definiti nell'intervallo Unicode da 0 a 65.535, un carattere può essere archiviato per ogni coppia di byte. Tuttavia, in intervalli Unicode superiori (da 65.536 a 1.114.111) un carattere può usare due coppie di byte. Ad esempio, in una colonna definita come nchar(10), il motore di database può archiviare 10 caratteri che usano una coppia di byte (intervallo Unicode da 0 a 65.535), ma meno di 10 caratteri quando si usano due coppie di byte (intervallo Unicode 65.536 a 1.114.111). Per altre informazioni sull'archiviazione Unicode e sugli intervalli di caratteri, vedere Differenze nell'archiviazione tra UTF-8 e UTF-16.

Se non si specifica n in un'istruzione di definizione dei dati o di dichiarazione di variabili, la lunghezza predefinita è 1. Se non si specifica n con la funzione CAST, la lunghezza predefinita è 30.

Se si usa nchar o nvarchar, è consigliabile:

  • Usare nchar quando le dimensioni delle voci di dati delle colonne sono coerenti.
  • Usare nvarchar quando le dimensioni delle voci di dati delle colonne presentano notevoli differenze.
  • Usare nvarchar(max) quando le dimensioni delle voci di dati delle colonne variano in modo significativo e la lunghezza delle stringhe potrebbe essere superiore a 4.000 coppie di byte.

sysname è un tipo di dati definito dall'utente fornito dal sistema equivalente a nvarchar(128), ad eccezione del fatto che non è nullable. sysname viene usato per fare riferimento a nomi di oggetti di database.

Gli oggetti che usano nchar o nvarchar vengono assegnati alle regole di confronto predefinite del database, a meno che non vengano assegnate regole di confronto specifiche usando la COLLATE clausola .

SET ANSI_PADDING è sempre ON per nchar e nvarchar. SET ANSI_PADDING OFF non si applica ai tipi di dati nchar o nvarchar .

Prefisso una costante di stringa di caratteri Unicode con la lettera N per segnalare l'input UCS-2 o UTF-16, a seconda che venga usata o meno una confronto SC. Senza il prefisso, la N stringa viene convertita nella tabella codici predefinita del database che potrebbe non riconoscere determinati caratteri. A partire da SQL Server 2019 (15.x), quando vengono usate regole di confronto abilitate per UTF-8, la tabella codici predefinita è in grado di archiviare il set di caratteri Unicode UTF-8.

Quando si prefissi una costante stringa con la lettera N, la conversione implicita comporterà una stringa UCS-2 o UTF-16 se la costante da convertire non supera la lunghezza massima per il tipo di dati stringa nvarchar (4.000). In caso contrario, la conversione implicita comporta un valore di grandi dimensioni nvarchar(max).

Avviso

Ogni colonna non Null varchar(max) o nvarchar(max) richiede 24 byte di allocazione fissa aggiuntiva che concorre al raggiungimento del limite delle righe di 8.060 byte durante un'operazione di ordinamento. Questi byte aggiuntivi possono creare un limite implicito al numero di colonne non Null varchar(max) o nvarchar(max) in una tabella. Non vengono segnalati errori particolari (oltre il normale avviso che indica che le dimensioni massime per le righe superano il valore massimo consentito di 8.060 byte) durante la creazione della tabella o l'inserimento dei dati. Queste grandi dimensioni di riga possono causare errori (ad esempio errore 512) che gli utenti non possono prevedere durante le normali operazioni, ad esempio l'aggiornamento della chiave di indice cluster o l'ordinamento del set di colonne completo.

Convertire i dati dei caratteri

Per informazioni sulla conversione dei dati di tipo carattere, vedere char e varchar (Transact-SQL).

Vedi anche