Condividi tramite


char and varchar (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Tipi di dati character a dimensione fissa char o a dimensione variabile varchar. A partire da SQL Server 2019 (15.x), quando si usano regole di confronto abilitate per UTF-8, questi tipi di dati archiviano l'intera gamma di dati carattere Unicode e usano la codifica dei caratteri UTF-8 . Se si specificano regole di confronto non UTF-8, questi tipi di dati archiviano solo un subset dei caratteri supportati dalla tabella codici corrispondente di tali regole di confronto.

Argomenti

char [ ( n ) ]

Dati stringa a dimensione fissa. n definisce le dimensioni della stringa in byte e deve essere un valore compreso tra 1 e 8.000. Per i set di caratteri di codifica a byte singolo, Latinad esempio , le dimensioni di archiviazione sono n byte e il numero di caratteri che è possibile archiviare è anche n. Per i set di caratteri di codifica multibyte, le dimensioni di archiviazione sono ancora n byte, ma il numero di caratteri che possono essere archiviati potrebbe essere inferiore a n. Il sinonimo ISO per char è character. Per altre informazioni sui set di caratteri, vedere Set di caratteri a byte singolo e multibyte.

varchar [ ( n | max ) ]

Dati stringa a dimensione variabile. Usare n per definire le dimensioni della stringa in byte e può essere un valore compreso tra 1 e 8.000 oppure usare max per indicare una dimensione massima del vincolo di colonna fino a un massimo di archiviazione di 2^31-1 byte (2 GB). Per i set di caratteri di codifica a byte singolo, Latinad esempio , le dimensioni di archiviazione sono n byte + 2 byte e il numero di caratteri che è possibile archiviare è anche n. Per i set di caratteri di codifica multibyte, le dimensioni di archiviazione sono ancora n byte + 2 byte, ma il numero di caratteri che possono essere archiviati potrebbe essere inferiore a n. I sinonimi ISO per varchar sono caratteri variabili o caratteri variabili. Per altre informazioni sui set di caratteri, vedere Set di caratteri a byte singolo e multibyte.

Osservazioni:

Un errore comune è pensare che con char(n) e varchar(n), n definisce il numero di caratteri. Tuttavia, in char(n) e varchar(n), n definisce la lunghezza della stringa in byte (da 0 a 8.000). n non definisce mai il numero di caratteri che è possibile archiviare, Questo concetto è simile alla definizione di nchar e nvarchar.

L'errore si verifica perché quando si usa la codifica a byte singolo, le dimensioni di archiviazione di char e varchar sono n byte e il numero di caratteri è anche n. Tuttavia, per la codifica multibyte, ad esempio UTF-8, intervalli Unicode superiori (da 128 a 1.114.111) generano un carattere usando due o più byte. Ad esempio, in una colonna definita come char(10) il motore di database può archiviare 10 caratteri che usano la codifica a byte singolo (intervallo Unicode compreso tra 0 e 127), ma meno di 10 caratteri quando si usa la codifica multibyte (intervallo Unicode da 128 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 n non viene specificato quando si usano le CAST funzioni e CONVERT , la lunghezza predefinita è 30.

Agli oggetti che usano char o varchar vengono assegnate le regole di confronto predefinite del database, a meno che non vengano assegnate regole di confronto specifiche tramite la COLLATE clausola . Le regole di confronto controllano la tabella codici utilizzata per l'archiviazione dei dati di tipo carattere.

Le codifiche multibyte in SQL Server includono:

  • Set di caratteri DBCS (Double Byte Character Set) per alcune lingue asiatiche orientali che usano le tabelle codici 936 e 950 (cinese), 932 (giapponese) o 949 (coreano).

  • UTF-8 con tabella codici 65001.

    Si applica a: SQL Server 2019 (15.x) e versioni successive.

In presenza di siti che supportano più lingue:

  • A partire da SQL Server 2019 (15.x), è consigliabile usare le regole di confronto abilitate per UTF-8 per il supporto di Unicode e per ridurre al minimo i problemi di conversione dei caratteri.
  • Se si usa una versione precedente di SQL Server motore di database, è consigliabile usare i tipi di dati Unicode nchar o nvarchar per ridurre al minimo i problemi di conversione dei caratteri.

Se si usa char o varchar, è consigliabile:

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

Se SET ANSI_PADDING è OFF quando CREATE TABLE viene eseguito o ALTER TABLE , una colonna char definita come NULL viene gestita come varchar.

Avviso

Ogni colonna varchar(max) o nvarchar(max) non null richiede 24 byte di allocazione fissa aggiuntiva, che viene conteggiato rispetto al limite di riga di 8.060 byte durante un'operazione di ordinamento. Ciò può creare un limite implicito al numero di colonne non Null varchar(max) o nvarchar(max) che è possibile creare 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 dimensioni elevate delle righe possono causare errori (ad esempio, l'errore 512) durante alcune operazioni normali, ad esempio un aggiornamento della chiave dell'indice cluster, o operazioni di ordinamento dell'intero set di colonne e si verificano solo nel corso dell'esecuzione di un'operazione.

Convertire i dati di tipo carattere

Se un'espressione di caratteri viene convertita in un tipo di dati carattere di dimensioni diverse, i valori troppo lunghi per il nuovo tipo di dati vengono troncati. Ai fini della conversione da un'espressione di caratteri, il tipo uniqueidentifier viene considerato un tipo carattere ed è quindi soggetto alle regole di troncamento per la conversione in tipo carattere. Vedere la sezione Esempi .

Se un'espressione di caratteri viene convertita in un'espressione di caratteri con tipo di dati o dimensioni diverse, ad esempio dachar(5) a varchar(5), o da char(20) a char(15), al valore convertito vengono assegnate le regole di confronto del valore di input. Se un'espressione non di caratteri viene convertita in dati di tipo carattere, al valore convertito vengono assegnate le regole di confronto predefinite del database corrente. In entrambi i casi è possibile assegnare regole di confronto specifiche mediante la clausola COLLATE.

Nota

Le traduzioni della tabella codici sono supportate per i tipi di dati char e varchar , ma non per il tipo di dati text . Come nelle versioni precedenti di SQL Server, la perdita di dati durante le conversioni tra tabelle codici non viene segnalata.

Le espressioni di caratteri convertite in un tipo di dati numeric approssimato possono includere una notazione esponenziale facoltativa. Questa notazione è un segno minuscolo o maiuscolo e E seguito da un segno più facoltativo (+) o meno (-) e quindi da un numero.

Le espressioni di caratteri convertite in un tipo di dati numerico esatto devono essere costituite da cifre, un separatore decimale e un segno più facoltativo () o meno (-+). Gli spazi vuoti iniziali vengono ignorati. I separatori di virgole, ad esempio il separatore delle migliaia in 123,456.00, non sono consentiti nella stringa.

Le espressioni di caratteri convertite in tipi di dati money o smallmoney possono includere anche un separatore decimale facoltativo e un segno di dollaro ($). I separatori di virgole, come in $123,456.00, sono consentiti.

Quando una stringa vuota viene convertita in un valore int, il relativo valore diventa 0. Quando una stringa vuota viene convertita in una data, il relativo valore diventa la data , ovvero 1900-01-01.

Esempi

R. Mostra il valore predefinito di n quando viene usato nella dichiarazione di variabile

L'esempio seguente mostra che il valore predefinito di n è 1 per i tipi di dati char e varchar , se usato nella dichiarazione di variabile.

DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';

--The following query returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

B. Mostra il valore predefinito di n quando viene usato varchar con CAST e CONVERT

L'esempio seguente mostra che il valore predefinito di n è 30 quando i tipi di dati char o varchar vengono usati con le CAST funzioni e CONVERT .

DECLARE @myVariable AS VARCHAR(40);
SET @myVariable = 'This string is longer than thirty characters';

SELECT CAST(@myVariable AS VARCHAR);
SELECT DATALENGTH(CAST(@myVariable AS VARCHAR)) AS 'VarcharDefaultLength';
SELECT CONVERT(CHAR, @myVariable);
SELECT DATALENGTH(CONVERT(CHAR, @myVariable)) AS 'VarcharDefaultLength';

C. Convertire i dati a scopo di visualizzazione

Nell'esempio seguente vengono convertite due colonne in dati di tipo carattere e viene utilizzato uno stile che applica un formato specifico ai dati visualizzati. Un tipo money viene convertito in dati di tipo carattere e viene applicato lo stile 1 , che visualizza i valori con virgole ogni tre cifre a sinistra del separatore decimale e due cifre a destra del separatore decimale. Un tipo datetime viene convertito in dati di tipo carattere e viene applicato lo stile 3 , che visualizza i dati nel formato dd/mm/yy. WHERE Nella clausola viene eseguito il cast di un tipo money a un tipo di carattere per eseguire un'operazione di confronto di stringhe.

USE AdventureWorks2022;
GO

SELECT BusinessEntityID,
    SalesYTD,
    CONVERT(VARCHAR(12), SalesYTD, 1) AS MoneyDisplayStyle1,
    GETDATE() AS CurrentDate,
    CONVERT(VARCHAR(12), GETDATE(), 3) AS DateDisplayStyle3
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS VARCHAR(20)) LIKE '1%';

Il set di risultati è il seguente.

BusinessEntityID SalesYTD              DisplayFormat CurrentDate             DisplayDateFormat
---------------- --------------------- ------------- ----------------------- -----------------
278              1453719.4653          1,453,719.47  2011-05-07 14:29:01.193 07/05/11
280              1352577.1325          1,352,577.13  2011-05-07 14:29:01.193 07/05/11
283              1573012.9383          1,573,012.94  2011-05-07 14:29:01.193 07/05/11
284              1576562.1966          1,576,562.20  2011-05-07 14:29:01.193 07/05/11
285              172524.4512           172,524.45    2011-05-07 14:29:01.193 07/05/11
286              1421810.9242          1,421,810.92  2011-05-07 14:29:01.193 07/05/11
288              1827066.7118          1,827,066.71  2011-05-07 14:29:01.193 07/05/11

D. Convertire i dati uniqueidentifier

Nell'esempio seguente viene convertito un valore uniqueidentifier in un tipo di dati char .

DECLARE @myid UNIQUEIDENTIFIER = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';

Nell'esempio seguente viene illustrato il troncamento dei dati quando il valore è troppo lungo per il tipo di dati in cui avviene la conversione. Poiché la lunghezza del tipo uniqueidentifier è limitata a 36 caratteri, i caratteri eccedenti vengono troncati.

DECLARE @ID NVARCHAR(MAX) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(UNIQUEIDENTIFIER, @ID) AS TruncatedValue;

Il set di risultati è il seguente.

String                                     TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong  0E984725-C51C-4BF4-9960-E1C80E27ABA0