Condividi tramite


char and varchar (Transact-SQL)

Tipo di dati string a lunghezza fissa o variabile.

  • char [ ( n ) ]
    Dati di tipo string a lunghezza fissa non Unicode. Il parametro n consente di definire la lunghezza della stringa e deve essere un valore compreso tra 1 e 8.000. Le dimensioni dello spazio di archiviazione corrispondono a n byte. Il sinonimo di ISO per char è character.

  • varchar [ ( n | max ) ]
    Dati di tipo string a lunghezza variabile non Unicode. Il parametro n consente di definire la lunghezza della stringa e può essere un valore compreso tra 1 e 8.000. Tramite max viene indicato che la capacità di memorizzazione massima è di 2^31-1 byte (2 GB). Le dimensioni dello spazio di archiviazione corrispondono alla lunghezza effettiva dei dati immessi + 2 byte. I sinonimi di ISO per il tipo di dati varchar sono char varying o character varying.

Osservazioni

Se n non viene specificato in un'istruzione di definizione dei dati o di dichiarazione di variabili, la lunghezza predefinita è 1. When n viene omesso nell'utilizzo delle funzioni CAST e CONVERT, la lunghezza predefinita è 30.

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

Nel caso di siti che supportano più lingue, è consigliabile utilizzare i tipi di dati Unicode nchar o nvarchar per ridurre al minimo i problemi di conversione dei caratteri. Se si utilizzano i tipi di dati char o varchar, è consigliabile:

  • Utilizzare il tipo di dati char quando le dimensioni delle voci della colonna dati sono consistenti.

  • Utilizzare il tipo di dati varchar quando le dimensioni delle voci della colonna dati variano in modo significativo.

  • Utilizzare il tipo di dati varchar(max) quando le dimensioni delle voci della colonna dati variano in modo significativo e le dimensioni possono essere superiori a 8.000 byte.

Se l'opzione SET ANSI_PADDING è impostata su OFF quando si esegue l'istruzione CREATE TABLE o ALTER TABLE, le colonne di tipo char definite come NULL vengono gestite come colonne di tipo varchar.

Quando la tabella codici delle regole di confronto utilizza caratteri a doppio byte, le dimensioni di archiviazione risultano comunque pari a n byte. A seconda della stringa di caratteri, le dimensioni di archiviazione di n byte possono corrispondere a meno di n caratteri.

Conversione dei 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. Per la conversione da un'espressione di caratteri, il tipo uniqueidentifier è considerato un tipo di dati carattere ed è pertanto soggetto alle regole di troncamento per la conversione in un tipo di dati carattere. Vedere la sezione Esempi riportata di seguito.

Se un'espressione di caratteri viene convertita in un'espressione di caratteri con tipo di dati o dimensioni diverse, ad esempio da char(5) a varchar(5), oppure 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 conversioni di tabella codici sono supportate per i tipi di dati char e varchar, ma non per il tipo di dati text. Come nel caso delle versioni precedenti di SQL Server, la perdita di dati durante le conversioni di tabella codici non viene segnalata.

Le espressioni di caratteri che vengono convertite in un tipo di dati numeric approssimato possono includere una notazione esponenziale facoltativa (una e minuscola o maiuscola seguita da un segno più (+) o meno (-) facoltativo e quindi da un numero).

Le espressioni di caratteri che vengono convertite in un tipo di dati numeric esatto devono includere cifre, il separatore decimale e un segno più (+) o meno (-) facoltativo. Gli spazi vuoti iniziali vengono ignorati. L'utilizzo della virgola come separatore, ad esempio come separatore decimale nel numero 123.456,00 non è consentito.

Le espressioni di caratteri che vengono convertite nel tipo di dati money o smallmoney possono includere inoltre un separatore decimale e il simbolo di dollaro ($) facoltativi. L'utilizzo della virgola come separatore decimale, ad esempio $ 123.456,00, è consentito.

Esempi

A.Visualizzazione del valore predefinito di n se utilizzato per la dichiarazione di variabili.

Nell'esempio seguente viene illustrato come il valore predefinito di n è 1 per i tipi di dati char e varchar quando vengono utilizzati per la dichiarazione di variabili.

DECLARE @myVariable AS varchar = 'abc';
DECLARE @myNextVariable AS char = 'abc';
--The following returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

B.Visualizzazione del valore predefinito di n se varchar viene utilizzato con CAST e CONVERT.

Nell'esempio seguente viene illustrato come il valore predefinito di n è 30 quando i tipi di dati char e varchar vengono utilizzati con le funzioni CAST 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.Conversione di dati per la 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. Tale stile consente di visualizzare i valori con le virgole ogni tre cifre a sinistra del separatore decimale e due cifre a destra del separatore decimale. Il tipo datetime viene convertito nei dati di tipo carattere e viene applicato lo stile 3, che consente di visualizzare i dati nel formato gg/mm/aa. Nella clausola WHERE il cast del tipo money viene eseguito a un tipo carattere per eseguire un'operazione di confronto tra stringhe.

USE AdventureWorks2012;
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%';

Set di risultati:

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.Conversione del tipo di dati uniqueidentifier

Nell'esempio seguente un valore uniqueidentifier viene convertito 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;

Set di risultati:

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

(1 row(s) affected)

Vedere anche

Riferimento

nchar e nvarchar (Transact-SQL)

CAST e CONVERT (Transact-SQL)

COLLATE (Transact-SQL)

Tipi di dati (Transact-SQL)

Concetti

Conversione del tipo di dati (Motore di database)

Altre risorse

Stima delle dimensioni di un database