Partilhar via


char e varchar (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW) Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Banco de Dados SQL no Microsoft Fabric

Tipos de dados de caractere que sejam de tamanho fixo, char ou de tamanho variável, varchar. A partir do SQL Server 2019 (15.x), quando uma ordenação habilitada para UTF-8 é usada, esses tipos de dados armazenam toda a gama de dados de caracteres Unicode e usam a codificação de caracteres UTF-8. 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.

Argumentos

char [ ( n ) ]

Dados de cadeia de caracteres de tamanho fixo. n define o tamanho da cadeia de caracteres em bytes e deve ser um valor de 1 a 8.000. Para conjuntos de caracteres de codificação de byte único, como Latin, o tamanho de armazenamento é n bytes e a quantidade de caracteres que pode ser armazenada também é n. Para conjuntos de caracteres de codificação multibyte, o tamanho do armazenamento ainda é n bytes, mas o número de caracteres que podem ser armazenados pode ser menor que n. O sinônimo ISO para char é character. Para saber mais sobre conjuntos de caracteres, consulte Conjuntos de caracteres multibyte e de byte único.

varchar [ ( n | máx ) ]

Dados de cadeia de caracteres de tamanho variável. Use n para definir o tamanho da cadeia de caracteres em bytes, podendo ser um valor de 1 a 8.000, ou use max para indicar um tamanho de restrição de coluna até um armazenamento máximo de 2^31-1 bytes (2 GB). Para conjuntos de caracteres de codificação de byte único, como Latin, o tamanho de armazenamento é n bytes + 2 bytes e a quantidade de caracteres que pode ser armazenada também é n. Para conjuntos de caracteres de codificação multibyte, o tamanho do armazenamento ainda é n bytes + 2 bytes, mas o número de caracteres que podem ser armazenados pode ser menor que n. Os sinônimos ISO para varchar são charvarying ou charactervarying. Para saber mais sobre conjuntos de caracteres, consulte Conjuntos de caracteres multibyte e de byte único.

Comentários

Um equívoco comum é pensar que, com char(n) e varchar(n), o n define o número de caracteres. No entanto, em char(n) e varchar(n), o n define o tamanho da cadeia de caracteres em bytes (0 a 8.000). n nunca define números de caracteres que podem ser armazenados. Este conceito é semelhante à definição de nchar e nvarchar.

O equívoco acontece porque, ao usar a codificação de byte único, o tamanho do armazenamento de char e varchar é n bytes e o número de caracteres também é n. No entanto, para codificação multibytes, como UTF-8, intervalos Unicode mais altos (128 a 1.114.111) resultam em um caractere usando dois ou mais bytes. Por exemplo, em uma coluna definida como char(10), o Mecanismo de Banco de Dados pode armazenar 10 caracteres que usam a codificação de byte único (intervalo Unicode 0 a 127), mas menos de 10 caracteres ao usar a codificação de multibytes (intervalo Unicode 128 a 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.

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. Se n não for especificado ao usar as funções CAST e CONVERT, o tamanho padrão será 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. A ordenação controla a página de código que é usada para armazenar os dados de caractere.

As codificações de vários bytes em SQL Server incluem:

  • 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).

  • UTF-8 com página de código 65001.

    Aplica-se a: SQL Server 2019 (15.x) e versões posteriores.

Se você tiver sites compatíveis com vários idiomas:

  • A partir do 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.
  • Se está usando uma versão anterior do Mecanismo de Banco de Dados do SQL Server, considere usar os tipos de dados Unicode nchar ou nvarchar para minimizar os problemas de conversão de caracteres.

Caso use char ou varchar, recomendamos que você:

  • 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 da cadeia de caracteres puder exceder 8.000 bytes.

Se SET ANSI_PADDING for OFF quando ou CREATE TABLE ALTER TABLE for executado, uma coluna char definida como NULL será tratada como 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 linhas de 8.060 bytes durante uma operação de classificação. 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.

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. 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.

Converter dados de caractere

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 caracteres e, portanto, está sujeito às regras de truncamento de conversão em um tipo de caractere. Consulte a seção Exemplos.

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. 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. Em qualquer caso, você pode atribuir uma ordenação específica usando a cláusula COLLATE.

Observação

Há suporte para conversões de página de código em tipos de dados char e varchar, mas não para o tipo de dados text. Assim 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.

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

As expressões de caractere que estão sendo convertidas em 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 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 ($). São permitidos separadores de vírgula, como em $123,456.00.

Quando uma cadeia de caracteres vazia é convertida em um int, seu valor se torna 0. Quando uma string vazia é convertida em uma data, seu valor se torna a data - que é 1900-01-01.

Exemplos

a. Mostrar 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 usados na declaração de variável.

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

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

B. Mostrar 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. Converter 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 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. Um tipo datetime é convertido em dados de caractere e o estilo 3 é aplicado, o que exibe os dados no formato 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.

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

Veja a seguir 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. Converter dados de identificador exclusivo

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;

Veja a seguir o conjunto de resultados.

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