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

APLICA-SE A: SimSQL Server SimBanco de Dados SQL do Azure SimAzure Synapse Analytics (SQL DW) SimParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database YesAzure Synapse Analytics (SQL DW) YesParallel Data Warehouse

Tipos de dados de caractere que sejam de tamanho fixo, char ou de tamanho variável, varchar.Character data types that are either fixed-size, char, or variable-size, varchar. A partir do SQL Server 2019 (15.x)SQL Server 2019 (15.x), quando uma ordenação habilitada por UTF-8 é usada, esses tipos de dados armazenam o intervalo completo de dados de caractere Unicode e usam a codificação de caracteres 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 uma ordenação não UTF-8 for especificada, esses tipos de dados armazenarão apenas um subconjunto de caracteres compatíveis com a página de código correspondente dessa ordenação.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.

ArgumentosArguments

char [ ( n ) ] Dados de cadeia de caracteres de tamanho fixo.char [ ( n ) ] Fixed-size string data. n define o tamanho da cadeia de caracteres em bytes e deve ser um valor de 1 a 8.000.n defines the string size in bytes and must be a value from 1 through 8,000. Para conjuntos de caracteres de codificação de byte único, como Latino, o tamanho de armazenamento é n bytes e a quantidade de caracteres que pode ser armazenada também é 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. Para conjuntos de caracteres de codificação multibyte, o tamanho de armazenamento ainda será n bytes, mas a quantidade de caracteres que pode ser armazenada pode ser menor que 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. O sinônimo ISO para char é character.The ISO synonym for char is character. Para saber mais sobre conjuntos de caracteres, consulte Conjuntos de caracteres multibyte e de byte único.For more information on character sets, see Single-Byte and Multibyte Character Sets.

varchar [ ( n | max ) ] Dados de cadeia de caracteres de tamanho variável.varchar [ ( n | max ) ] Variable-size string data. Use n para definir o tamanho da cadeia de caracteres em bytes e pode ser um valor de 1 a 8.000 ou usar max para indicar um tamanho de restrição de coluna até um armazenamento máximo de 2^31-1 bytes (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). Para conjuntos de caracteres de codificação de byte único, como Latino, o tamanho de armazenamento é n bytes + 2 bytes e a quantidade de caracteres que pode ser armazenada também é 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. Para codificação de conjuntos de caracteres multibytes, o tamanho de armazenamento ainda será n bytes + 2 bytes, mas a quantidade de caracteres que pode ser armazenada pode ser menor que 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. Os sinônimos ISO para varchar são charvarying ou charactervarying.The ISO synonyms for varchar are charvarying or charactervarying. Para saber mais sobre conjuntos de caracteres, consulte Conjuntos de caracteres multibyte e de byte único.For more information on character sets, see Single-Byte and Multibyte Character Sets.

ComentáriosRemarks

Um equívoco comum é considerar que em CHAR(n) e VARCHAR(n), n define o número de caracteres.A common misconception is to think that CHAR(n) and VARCHAR(n), the n defines the number of characters. Mas em CHAR(n) e VARCHAR(n), o n define o comprimento da cadeia de caracteres em bytes (0 a 8.000).But in CHAR(n) and VARCHAR(n) the n defines the string length in bytes (0-8,000). n nunca define números de caracteres que podem ser armazenados.n never defines numbers of characters that can be stored. Isso é semelhante à definição de NCHAR(n) e NVARCHAR(n).This is similar to the definition of NCHAR(n) and NVARCHAR(n). O equívoco acontece porque, ao usar a codificação de byte único, o tamanho do armazenamento de CHAR e VCHAR é n bytes e o número de caracteres também é 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. No entanto, para codificação multibytes, como UTF-8, intervalos Unicode mais altos (128 – 1.114.111) resultam em um caractere usando dois ou mais bytes.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. Por exemplo, em uma coluna definida como CHAR(10), o Mecanismo de Banco de DadosDatabase Engine pode armazenar 10 caracteres que usam a codificação de byte único (intervalo Unicode 0 – 127), mas menos de 10 caracteres ao usar a codificação de multibytes (intervalo Unicode 128 – 1.114.111).For example, in a column defined as CHAR(10), the Mecanismo de Banco de DadosDatabase 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). Para obter mais informações sobre o armazenamento e os intervalos de caracteres Unicode, confira Diferenças de armazenamento entre UTF-8 e UTF-16.For more information about Unicode storage and character ranges, see Storage differences between UTF-8 and UTF-16.

Quando n não é especificado em uma definição de dados ou instrução de declaração de variável, o tamanho padrão é 1.When n isn't specified in a data definition or variable declaration statement, the default length is 1. Se n não for especificado ao usar as funções CAST e CONVERT, o tamanho padrão será 30.If n isn't specified when using the CAST and CONVERT functions, the default length is 30.

Os objetos que usam char ou varchar são atribuídos à ordenação padrão do banco de dados, a menos que uma ordenação específica seja atribuída usando da cláusula 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. A ordenação controla a página de código que é usada para armazenar os dados de caractere.The collation controls the code page that is used to store the character data.

As codificações multibyte no SQL ServerSQL Server incluem:Multibyte encodings in SQL ServerSQL Server include:

  • Conjuntos de caracteres de byte duplo (DBCS) para alguns idiomas do Leste da Ásia que usam páginas de código 936 e 950 (chinês), 932 (japonês) ou 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 com página de código 65001.UTF-8 with code page 65001. Aplica-se a: SQL ServerSQL Server (Começando com 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)))

Se você tiver sites compatíveis com vários idiomas:If you have sites that support multiple languages:

  • A partir do SQL Server 2019 (15.x)SQL Server 2019 (15.x), considere o uso de uma ordenação habilitada para UTF-8 para dar suporte a Unicode e minimizar os problemas de conversão de caracteres.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.
  • Caso use uma versão inferior do Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine, considere usar os tipos de dados nchar ou nvarchar Unicode para minimizar problemas de conversão de caracteres.If using a lower version of the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine, consider using the Unicode nchar or nvarchar data types to minimize character conversion issues.

Caso use char ou varchar, recomendamos que:If you use char or varchar, we recommend to:

  • Use char quando os tamanhos das entradas de dados de coluna forem consistentes.Use char when the sizes of the column data entries are consistent.
  • Use varchar quando os tamanhos das entradas de dados de coluna variarem consideravelmente.Use varchar when the sizes of the column data entries vary considerably.
  • Use varchar(max) quando os tamanhos das entradas de dados de coluna variarem consideravelmente e o tamanho da cadeia de caracteres puder exceder 8.000 bytes.Use varchar(max) when the sizes of the column data entries vary considerably, and the string length might exceed 8,000 bytes.

Se SET ANSI_PADDING for OFF quando CREATE TABLE ou ALTER TABLE for executada, uma coluna char definida como NULL será tratada como 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.

Aviso

Cada coluna varchar(max) ou nvarchar(max) não nula requer 24 bytes de alocação fixa adicional que conta para o limite de linha de 8.060 bytes durante uma operação de classificação.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. Isso pode criar um limite implícito para o número de colunas varchar(max) ou nvarchar(max) não nulas que podem ser criadas em uma tabela.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. Nenhum erro especial é fornecido quando a tabela é criada (além do aviso comum de que o tamanho máximo da linha excede o máximo permitido de 8.060 bytes) ou no momento da inserção de dados.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. Esse tamanho de linha maior pode causar erros (por exemplo, o erro 512) durante algumas operações normais, como uma atualização de chave de índice clusterizado ou classificações do conjunto de colunas completo, que ocorrerão apenas ao executar uma operação.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 will only occur while performing an operation.

Convertendo dados de caractereConverting Character Data

Quando são convertidas expressões character a um tipo de dados character de um tamanho diferente, os valores muito longos para o novo tipo de dados são truncados.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. O tipo uniqueidentifier é considerado um tipo de caractere para fins de conversão de uma expressão de caracteres e, portanto, está sujeito às regras de truncamento de conversão em um tipo de caractere.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. Consulte a seção de Exemplos a seguir.See the Examples section that follows.

Quando uma expressão character é convertida em uma expressão character de um tipo de dados ou tamanho diferente, como de char(5) em varchar(5) ou char(20) para char(15) , a ordenação do valor de entrada é atribuída ao valor convertido.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 uma expressão noncharacter for convertida em um tipo de dados character, a ordenação padrão do banco de dados atual será atribuída ao valor convertido.If a noncharacter expression is converted to a character data type, the default collation of the current database is assigned to the converted value. Em qualquer caso, você pode atribuir uma ordenação específica usando a cláusula COLLATE.In either case, you can assign a specific collation by using the COLLATE clause.

Observação

Há suporte para conversões de página de código em tipos de dados char e varchar, mas não no tipo de dados text.Code page translations are supported for char and varchar data types, but not for text data type. Assim como em versões anteriores do SQL ServerSQL Server, a perda de dados não é informada durante as conversões de página de código.As with earlier versions of SQL ServerSQL Server, data loss during code page translations isn't reported.

Expressões de caracteres que estão sendo convertidas a um tipo de dados numeric aproximado podem incluir notação exponencial opcional.Character expressions that are being converted to an approximate numeric data type can include optional exponential notation. Esta notação é um e (minúsculo) ou um E (maiúsculo) seguido por um sinal de mais (+) ou menos (-) opcional e, em seguida, de um número.This notation is a lowercase e or uppercase E followed by an optional plus (+) or minus (-) sign and then a number.

As expressões character que estão sendo convertidas a um tipo de dados numeric exato devem consistir em dígitos, um ponto decimal e um sinal opcional de mais (+) ou menos (-).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 (-). Os espaços em branco à esquerda são ignorados.Leading blanks are ignored. Na cadeia de caracteres não são permitidos separadores de vírgula, como o separador de milhar em 123,456.00.Comma separators, such as the thousands separator in 123,456.00, aren't allowed in the string.

As expressões character que estão sendo convertidas em tipo de dados money ou smallmoney também podem incluir um separador decimal opcional e o sinal monetário ($).Character expressions being converted to money or smallmoney data types can also include an optional decimal point and dollar sign ($). São permitidos separadores de vírgula, como em $123,456.00.Comma separators, as in $123,456.00, are allowed.

Quando uma cadeia de caracteres vazia é convertida em um int, seu valor se torna 0.When an empty string get converted to an int, its value becomes 0. Quando uma cadeia de caracteres vazia é convertida em uma data, seu valor se torna o valor padrão para data, que é 1900-01-01.When an empty string gets converted to a date, its value becomes the default value for date - which is 1900-01-01.

ExemplosExamples

a.A. Como mostrar o valor padrão de n quando usado em declaração variávelShowing the default value of n when used in variable declaration

O exemplo a seguir mostra que o valor padrão de n é 1 para os tipos de dados char e varchar quando eles são usados em uma declaração de variável.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. Como mostrar o valor padrão de n quando varchar é usado com CAST e CONVERTShowing the default value of n when varchar is used with CAST and CONVERT

O exemplo a seguir mostra que o valor padrão de n é 30 quando os tipos de dados char ou varchar são usados com as funções 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. Convertendo dados para fins de exibiçãoConverting Data for Display Purposes

O exemplo a seguir converte duas colunas em tipos de caracteres e aplica um estilo que se aplica a um formato específico aos dados exibidos.The following example converts two columns to character types and applies a style that applies a specific format to the displayed data. Um tipo money é convertido em dados de caractere e o estilo 1 é aplicado, o que exibe os valores com vírgulas a cada três dígitos à esquerda do ponto decimal e dois dígitos à direita do ponto decimal.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. Um tipo datetime é convertido em dados de caractere e o estilo 3 é aplicado, o que exibe os dados no formato dd/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. Na cláusula WHERE, um tipo money é convertido em um tipo de caractere para executar uma operação de comparação de cadeia de caracteres.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%';

Este é o conjunto de resultados.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. Convertendo dados UniqueidentiferConverting Uniqueidentifer Data

O exemplo a seguir converte um valor uniqueidentifier em um tipo de dados char.The following example converts a uniqueidentifier value to a char data type.

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

O exemplo a seguir demonstra o truncamento de dados quando o valor é muito longo para o tipo de dados da conversão.The following example demonstrates the truncation of data when the value is too long for the data type being converted to. Como o tipo uniqueidentifier é limitado a 36 caracteres, os caracteres que excedem esse comprimento ficam truncados.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;

Este é o conjunto de resultados.Here is the result set.

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

(1 row(s) affected)

Confira tambémSee also

nchar and nvarchar (Transact-SQL) CAST e CONVERT (Transact-SQL) COLLATE (Transact-SQL) Conversão de Tipo de Dados(Mecanismo de Banco de Dados) Tipos de Dados (Transact-SQL) Estimar o Tamanho de um Banco de Dados Suporte para Ordenação e Unicode Conjuntos de Caracteres de Byte Único e Multibytenchar and nvarchar (Transact-SQL) CAST and CONVERT (Transact-SQL) COLLATE (Transact-SQL) Data Type Conversion (Database Engine) Data Types (Transact-SQL) Estimate the Size of a Database Collation and Unicode Support Single-Byte and Multibyte Character Sets