char and varchar (Transact-SQL)char and varchar (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Tipi di dati character a dimensione fissa char o a dimensione variabile varchar.Character data types that are either fixed-size, char, or variable-size, varchar. A partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x), quando si usano regole di confronto che supportano UTF-8, questi tipi di dati archiviano l'intera gamma dei dati di tipo carattere Unicode e usano la codifica dei caratteri UTF-8 .Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), when a UTF-8 enabled collation is used, these data types store the full range of Unicode character data and use the UTF-8 character encoding. 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.If a non-UTF-8 collation is specified, then these data types store only a subset of characters supported by the corresponding code page of that collation.

ArgomentiArguments

char [ ( n ) ] Dati stringa a dimensione fissa.char [ ( n ) ] Fixed-size string data. n definisce le dimensioni della stringa in byte e deve essere un valore compreso tra 1 e 8.000.n defines the string size in bytes and must be a value from 1 through 8,000. Per i set di caratteri con codifica a byte singolo, ad esempio Latin, le dimensioni di archiviazione sono pari a n byte e anche il numero di caratteri che possono essere archiviati è n.For single-byte encoding character sets such as Latin, the storage size is n bytes and the number of characters that can be stored is also n. Per i set di caratteri con codifica multibyte, le dimensioni di archiviazione sono di nuovo n byte, ma il numero di caratteri che possono essere archiviati può essere inferiore a n.For multibyte encoding character sets, the storage size is still n bytes but the number of characters that can be stored may be smaller than n. Il sinonimo ISO per char è character.The ISO synonym for char is character. Per altre informazioni sui set di caratteri, vedere Set di caratteri a byte singolo e multibyte.For more information on character sets, see Single-Byte and Multibyte Character Sets.

varchar [ ( n | max ) ] Dati stringa a dimensione variabile.varchar [ ( n | max ) ] Variable-size string data. Usare n per definire la dimensione della stringa in byte, che può essere un valore compreso tra 1 e 8000, oppure usare max per indicare la dimensione massima di archiviazione di un vincolo di colonna pari a 2^31-1 byte (2 GB).Use n to define the string size in bytes and can be a value from 1 through 8,000 or use max to indicate a column constraint size up to a maximum storage of 2^31-1 bytes (2 GB). Per i set di caratteri con codifica a byte singolo, ad esempio Latin, le dimensioni di archiviazione sono pari a n byte + 2 byte e anche il numero di caratteri che possono essere archiviati è n.For single-byte encoding character sets such as Latin, the storage size is n bytes + 2 bytes and the number of characters that can be stored is also n. Per i set di caratteri con codifica multibyte, le dimensioni di archiviazione sono di nuovo n byte + 2 byte, ma il numero di caratteri che possono essere archiviati può essere inferiore a n.For multi-byte encoding character sets, the storage size is still n bytes + 2 bytes but the number of characters that can be stored may be smaller than n. I sinonimi ISO per varchar sono charvarying o charactervarying.The ISO synonyms for varchar are charvarying or charactervarying. Per altre informazioni sui set di caratteri, vedere Set di caratteri a byte singolo e multibyte.For more information on character sets, see Single-Byte and Multibyte Character Sets.

RemarksRemarks

Si pensa comunemente che in CHAR(n) e VARCHAR(n), n definisca il numero di caratteri.A common misconception is to think that CHAR(n) and VARCHAR(n), the n defines the number of characters. Invece in CHAR(n) e VARCHAR(n) n definisce la lunghezza della stringa in byte (da 0 a 8.000).But in CHAR(n) and VARCHAR(n) the n defines the string length in bytes (0-8,000). n non definisce mai il numero di caratteri che è possibile archiviare,n never defines numbers of characters that can be stored. analogamente alla definizione di NCHAR(n) e NVARCHAR(n).This is similar to the definition of NCHAR(n) and NVARCHAR(n).
Si tende a pensare così perché quando si usa la codifica a byte singolo, le dimensioni di archiviazione di CHAR e VARCHAR sono espresse in n byte e anche il numero di caratteri è n.The misconception happens because when using single-byte encoding, the storage size of CHAR and VARCHAR is n bytes and the number of characters is also n. Tuttavia, per la codifica multibyte, ad esempio UTF-8, gli intervalli Unicode più elevati (128-1.114.111) generano un carattere che usa due o più byte.However, for multi-byte encoding such as UTF-8, higher Unicode ranges (128-1,114,111) result in one character using two or more bytes. Ad esempio in una colonna definita come CHAR(10) Motore di databaseDatabase Engine può archiviare 10 caratteri che usano la codifica a byte singolo (intervallo Unicode 0-127), ma meno di 10 caratteri quando usano la codifica multibyte (intervallo Unicode 128-1.114.111).For example, in a column defined as CHAR(10), the Motore di databaseDatabase Engine can store 10 characters that use single-byte encoding (Unicode range 0-127), but less than 10 characters when using multi-byte encoding (Unicode range 128-1,114,111). Per altre informazioni sull'archiviazione Unicode e sugli intervalli di caratteri, vedere Differenze nell'archiviazione tra UTF-8 e UTF-16.For more information about Unicode storage and character ranges, see Storage differences between UTF-8 and UTF-16.

Se non si specifica n in un'istruzione di definizione dei dati o di dichiarazione di variabili, la lunghezza predefinita è 1.When n isn't specified in a data definition or variable declaration statement, the default length is 1. Se non si specifica n quando si usano le funzioni CAST e CONVERT, la lunghezza predefinita è 30.If n isn't specified when using the CAST and CONVERT functions, the default length is 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 clausola COLLATE.Objects that use char or varchar are assigned the default collation of the database, unless a specific collation is assigned using the COLLATE clause. Le regole di confronto controllano la tabella codici utilizzata per l'archiviazione dei dati di tipo carattere.The collation controls the code page that is used to store the character data.

Le codifiche multibyte in SQL ServerSQL Server includono:Multibyte encodings in SQL ServerSQL Server include:

  • 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).Double-byte character sets (DBCS) for some East Asian languages using code pages 936 and 950 (Chinese), 932 (Japanese), or 949 (Korean).
  • UTF-8 con tabella codici 65001.UTF-8 with code page 65001. Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)))

In presenza di siti che supportano più lingue:If you have sites that support multiple languages:

  • A partire da SQL Server 2019 (15.x)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.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), consider using a UTF-8 enabled collation to support Unicode and minimize character conversion issues.
  • Se si usa una versione precedente di Motore di database di SQL ServerSQL Server Database Engine valutare la possibilità di usare i tipi di dati Unicode nchar oppure nvarchar per ridurre al minimo i problemi di conversione dei caratteri.If using a lower version of the Motore di database di SQL ServerSQL Server Database Engine, consider using the Unicode nchar or nvarchar data types to minimize character conversion issues.

Se si usano i tipi di dati char o varchar, è consigliabile:If you use char or varchar, we recommend to:

  • Usare char quando le dimensioni delle voci di dati delle colonne sono coerenti.Use char when the sizes of the column data entries are consistent.
  • Usare varchar quando le dimensioni delle voci di dati delle colonne presentano notevoli differenze.Use varchar when the sizes of the column data entries vary considerably.
  • 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.Use varchar(max) when the sizes of the column data entries vary considerably, and the string length might exceed 8,000 bytes.

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.If SET ANSI_PADDING is OFF when either CREATE TABLE or ALTER TABLE is executed, a char column that is defined as NULL is handled as varchar.

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.Each non-null varchar(max) or nvarchar(max) column requires 24 bytes of additional fixed allocation which counts against the 8,060 byte row limit during a sort operation. Ciò può creare un limite implicito per il numero di colonne non Null varchar(max) o nvarchar(max) che è possibile creare in una tabella.This can create an implicit limit to the number of non-null varchar(max) or nvarchar(max) columns that can be created in a table.
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.No special error is provided when the table is created (beyond the usual warning that the maximum row size exceeds the allowed maximum of 8,060 bytes) or at the time of data insertion. Queste dimensioni elevate delle righe possono causare errori (ad esempio, l'errore 512) durante alcune operazioni normali come un aggiornamento della chiave dell'indice cluster o durante operazioni di ordinamento dell'intero set di colonne e gli utenti possono prevederli prima dell'esecuzione di un'operazione.This large row size can cause errors (such as error 512) during some normal operations, such as a clustered index key update, or sorts of the full column set, which users can anticipate until performing an operation.

Conversione dei dati di tipo carattereConverting Character Data

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.When character expressions are converted to a character data type of a different size, values that are too long for the new data type are truncated. 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.The uniqueidentifier type is considered a character type for the purposes of conversion from a character expression, and so is subject to the truncation rules for converting to a character type. Vedere la sezione Esempi riportata di seguito.See the Examples section that follows.

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.When a character expression is converted to a character expression of a different data type or size, such as from char(5) to varchar(5), or char(20) to char(15), the collation of the input value is assigned to the converted value. 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.If a noncharacter expression is converted to a character data type, the default collation of the current database is assigned to the converted value. In entrambi i casi è possibile assegnare regole di confronto specifiche mediante la clausola COLLATE.In either case, you can assign a specific collation by using the COLLATE clause.

Nota

Le conversioni tra tabelle codici sono supportate per i tipi di dati char e varchar, ma non per il tipo di dati text.Code page translations are supported for char and varchar data types, but not for text data type. Come nelle versioni precedenti di SQL ServerSQL Server, la perdita di dati durante le conversioni tra tabelle codici non viene segnalata.As with earlier versions of SQL ServerSQL Server, data loss during code page translations isn't reported.

Le espressioni di caratteri convertite in un tipo di dati numeric approssimato possono includere una notazione esponenziale facoltativa.Character expressions that are being converted to an approximate numeric data type can include optional exponential notation. La notazione è costituita da una e minuscola o una E maiuscola seguita da un segno più (+) o meno (-) facoltativo e quindi un numero.This notation is a lowercase e or uppercase E followed by an optional plus (+) or minus (-) sign and then a number.

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.Character expressions that are being converted to an exact numeric data type must consist of digits, a decimal point, and an optional plus (+) or minus (-). Gli spazi vuoti iniziali vengono ignorati.Leading blanks are ignored. Nella stringa non è consentito l'uso della virgola come separatore, ad esempio come separatore decimale nel numero 123.456,00.Comma separators, such as the thousands separator in 123,456.00, aren't allowed in the string.

Le espressioni di caratteri che vengono convertite nel tipo di dati money o smallmoney possono includere anche un separatore decimale e il simbolo di dollaro ($) facoltativi.Character expressions being converted to money or smallmoney data types can also include an optional decimal point and dollar sign ($). L'utilizzo della virgola come separatore decimale, ad esempio $ 123.456,00, è consentito.Comma separators, as in $123,456.00, are allowed.

EsempiExamples

A.A. Visualizzazione del valore predefinito di n se utilizzato per la dichiarazione di variabili.Showing the default value of n when used in variable declaration.

L'esempio seguente indica che il valore predefinito di n è 1 per i tipi di dati char e varchar quando vengono usati per la dichiarazione di variabili.The following example shows the default value of n is 1 for the char and varchar data types when they are used in variable declaration.

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

B.B. Visualizzazione del valore predefinito di n se varchar viene utilizzato con CAST e CONVERT.Showing the default value of n when varchar is used with CAST and CONVERT.

L'esempio seguente indica che il valore predefinito di n è 30 quando i tipi di dati char e varchar vengono usati con le funzioni CAST e CONVERT.The following example shows that the default value of n is 30 when the char or varchar data types are used with the CAST and CONVERT functions.

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.C. Conversione di dati per la visualizzazioneConverting Data for Display Purposes

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.The following example converts two columns to character types and applies a style that applies a specific format to the displayed data. Un tipo di dati 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.A money type is converted to character data and style 1 is applied, which displays the values with commas every three digits to the left of the decimal point, and two digits to the right of the decimal point. Un tipo datetime viene convertito in dati di tipo carattere e viene applicato lo stile 3, che visualizza i dati nel formato gg/mm/aa.A datetime type is converted to character data and style 3 is applied, which displays the data in the format dd/mm/yy. Nella clausola WHERE il cast del tipo money viene eseguito a un tipo carattere per eseguire un'operazione di confronto tra stringhe.In the WHERE clause, a money type is cast to a character type to perform a string comparison operation.

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:Here is the result set.

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.D. Conversione del tipo di dati uniqueidentifierConverting Uniqueidentifer Data

Nell'esempio seguente un valore uniqueidentifier viene convertito in un tipo di dati char.The following example converts a uniqueidentifier value to a char data type.

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.The following example demonstrates the truncation of data when the value is too long for the data type being converted to. Poiché la lunghezza del tipo uniqueidentifier è limitata a 36 caratteri, i caratteri eccedenti vengono troncati.Because the uniqueidentifier type is limited to 36 characters, the characters that exceed that length are truncated.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';  
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;  

Set di risultati:Here is the result set.

String                                       TruncatedValue  
-------------------------------------------- ------------------------------------  
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong    0E984725-C51C-4BF4-9960-E1C80E27ABA0  
  
(1 row(s) affected)  

Vedere ancheSee also

nchar e nvarchar (Transact-SQL)nchar and nvarchar (Transact-SQL)
CAST e CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
COLLATE (Transact-SQL)COLLATE (Transact-SQL)
Conversione del tipo di dati (motore di database)Data Type Conversion (Database Engine)
Tipi di dati (Transact-SQL)Data Types (Transact-SQL)
Stima delle dimensioni di un database Estimate the Size of a Database
Regole di confronto e supporto Unicode Collation and Unicode Support
Set di caratteri a byte singolo e multibyteSingle-Byte and Multibyte Character Sets