char e varchar (Transact-SQL)

São tipos de dados de cadeia de caracteres de comprimento fixo ou variável.

  • char [ ( n ) ]
    Dados de cadeia de caracteres não Unicode de comprimento fixo. n define o comprimento da cadeia de caracteres e deve ser um valor de 1 a 8.000. O tamanho de armazenamento é n bytes. O sinônimo de ISO para char é character.

  • varchar [ ( n | max ) ]
    Dados de cadeia de caracteres não Unicode de comprimento variável. n define o comprimento da cadeia de caracteres e pode ser um valor de 1 a 8.000. max indica que o tamanho de armazenamento máximo é 2^31-1 bytes (2 GB). O tamanho de armazenamento é o comprimento real dos dados inseridos + 2 bytes. Os sinônimos de ISO para varchar são char varying ou character varying.

Comentários

Quando n não é especificado em uma definição de dados ou instrução de declaração de variável, o comprimento padrão é 1. Quando n não é especificado ao usar as funções CAST e CONVERT, o comprimento padrão é 30.

Os objetos que usam char ou varchar recebem o agrupamento padrão do banco de dados, a menos que um agrupamento específico seja atribuído com o uso da cláusula COLLATE. O agrupamento controla a página de código que é usada para armazenar os dados de caractere.

Se tiver sites que suportem vários idiomas, considere o uso dos tipos de dados Unicode nchar ou nvarchar para minimizar problemas de conversão de caracteres. Se você usar char ou varchar, recomenda-se o seguinte:

  • Use char quando os tamanhos das entradas de dados de coluna forem consistentes.

  • Use varchar quando os tamanhos das entradas de dados de coluna variarem consideravelmente.

  • Use varchar(max) quando os tamanhos das entradas de dados de coluna variarem consideravelmente e o tamanho puder exceder 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.

Quando a página de código de agrupamento usar caracteres de dois bytes, o tamanho de armazenamento ainda será n bytes. Dependendo da cadeia de caracteres, o tamanho de armazenamento de n bytes pode ser menos que n caracteres.

Convertendo dados character

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. O tipo uniqueidentifier é considerado um tipo de caractere para fins de conversão de uma expressão de caractere e, portanto, está sujeito às regras de truncamento para a conversão em um tipo de caractere. Consulte a seção de Exemplos a seguir.

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 de char(20) em char(15), o agrupamento do valor de entrada é atribuído ao valor convertido. Se uma expressão noncharacter for convertida em um tipo de dados character, o agrupamento padrão do banco de dados atual será atribuído ao valor convertido. Em qualquer caso, você pode atribuir um agrupamento específico usando a cláusula COLLATE.

ObservaçãoObservação

As conversões de página de código têm suporte em tipos de dados char e varchar, mas não em tipo de dados text. Como em versões anteriores do SQL Server, a perda de dados não é informada durante as conversões de página de código.

As expressões character que estão sendo convertidas a um tipo de dados numeric aproximado podem incluir notação exponencial opcional (um e minúsculo ou um E maiúsculo seguido por um sinal de mais (+) ou menos (-) opcional e, depois, um número).

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 (-). Os espaços em branco à esquerda são ignorados. Na cadeia de caracteres não são permitidos separadores de vírgula, como o separador de milhar em 123,456.00.

As expressões character convertidas em tipo de dados money ou smallmoney também podem incluir um ponto decimal opcional e o sinal de dólar ($). São permitidos separadores de vírgula, como em $123,456.00.

Exemplos

A.Mostrando o valor padrão de n quando usado em declaração variável.

O exemplo a seguir mostra que o valor padrão de n é 1 para os tipos de dados char e varchar quando são usados em uma declaração variável.

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

B.Mostrando o valor padrão de n quando varchar é usado com CAST e 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.

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.Convertendo dados para fins de exibição

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. Um tipo money é convertido em dados de caracteres 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. Um tipo datetime é convertido em dados de caracteres e o estilo 3 é aplicado, o que exibe os dados no formato dd/mm/aa. 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.

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

Aqui está o conjunto de resultados.

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.Convertendo dados Uniqueidentifer

O exemplo a seguir converte um valor uniqueidentifier em um tipo de dados char.

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. Como o tipo uniqueidentifier é limitado a 36 caracteres, os caracteres que excedem esse comprimento ficam truncados.

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

Aqui está o conjunto de resultados.

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

(1 row(s) affected)

Consulte também

Referência

nchar e nvarchar (Transact-SQL)

CAST e CONVERT (Transact-SQL)

COLLATE (Transact-SQL)

Tipos de dados (Transact-SQL)

Conceitos

Conversão de tipo de dados (Mecanismo de Banco de Dados)

Outros recursos

Estimar o tamanho de um banco de dados