Partilhar via


char e varchar (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Tipos de dados de caracteres que são de tamanho fixo, char ou tamanho variável, varchar. A partir do SQL Server 2019 (15.x), quando um agrupamento habilitado para UTF-8 é usado, esses tipos de dados armazenam o intervalo completo de dados de caracteres Unicode e usam a codificação de caracteres UTF-8 . Se um agrupamento não-UTF-8 for especificado, esses tipos de dados armazenarão apenas um subconjunto de caracteres suportados pela página de código correspondente desse agrupamento.

Arguments

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 do armazenamento é n bytes e o número de caracteres que podem ser armazenados também é n. Para conjuntos de caracteres de codificação multibyte, o tamanho do armazenamento ainda é de n bytes, mas o número de caracteres que podem ser armazenados pode ser menor que n. O sinônimo ISO para char é caráter. Para obter mais informações sobre conjuntos de caracteres, consulte Single-Byte e conjuntos de caracteres multibyte.

varchar [ ( n | máximo ) ]

Dados de cadeia de caracteres de tamanho variável. Use n para definir o tamanho da cadeia de caracteres em bytes e pode 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) ou 1 MB no Fabric Data Warehouse. Para conjuntos de caracteres de codificação de byte único, como Latin, o tamanho do armazenamento é n bytes + 2 bytes e o número de caracteres que podem ser armazenados 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 char variando ou variando caracteres. Para obter mais informações sobre conjuntos de caracteres, consulte Single-Byte e conjuntos de caracteres multibyte.

Remarks

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 comprimento da cadeia de caracteres em bytes (0 a 8.000). n nunca define o número de caracteres que podem ser armazenados. Este conceito é semelhante à definição de nchar e nvarchar.

O equívoco acontece porque ao usar codificação de byte único, o tamanho de armazenamento de char e varchar é n bytes e o número de caracteres também é n. No entanto, para codificação multibyte, 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 codificação de byte único (intervalo Unicode de 0 a 127), mas menos de 10 caracteres ao usar codificação multibyte (intervalo Unicode de 128 a 1.114.111). Para obter mais informações sobre armazenamento Unicode e intervalos de caracteres, consulte 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 variável, o comprimento padrão é 1. Se n não for especificado ao usar as CAST funções e CONVERT , o comprimento padrão será 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 usando a COLLATE cláusula. O agrupamento controla a página de código usada para armazenar os dados de caracteres.

As codificações multibyte no SQL Server incluem:

  • Conjuntos de caracteres de byte duplo (DBCS) para alguns idiomas do Leste Asiático usando 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 tiver sites que suportem vários idiomas:

  • A partir do SQL Server 2019 (15.x), considere usar um agrupamento habilitado para UTF-8 para dar suporte a Unicode e minimizar problemas de conversão de caracteres.
  • Se estiver 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 problemas de conversão de caracteres.

Se você usa char ou varchar, recomendamos que:

  • Use char quando os tamanhos das entradas de dados da coluna forem consistentes.
  • Use varchar quando os tamanhos das entradas de dados da coluna variarem consideravelmente.
  • Use varchar(max) quando os tamanhos das entradas de dados da coluna variarem consideravelmente, e o comprimento da cadeia de caracteres pode exceder 8.000 bytes.

Se SET ANSI_PADDING é OFF quando um ou CREATE TABLEALTER TABLE é executado, uma coluna char que é definida como é manipulada como NULLvarchar.

Warning

Cada coluna varchar(max) ou nvarchar(max) não nula requer 24 bytes de alocação fixa adicional, que conta em relação ao limite de linha 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 habitual 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 grande pode causar erros (como o erro 512) durante algumas operações normais, como uma atualização de chave de índice clusterizada ou classificações do conjunto de colunas completo, que só ocorrerão durante a execução de uma operação.

Converter dados de caracteres

Quando expressões de caractere são convertidas em um tipo de dados de caractere de um tamanho diferente, os valores que são 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 conversão em um tipo de caractere. Consulte a secção Exemplos .

Quando uma expressão de caractere é convertida em uma expressão de caractere de um tipo ou tamanho de dados diferente, como de char(5) para varchar(5), ou char(20) para char(15), o agrupamento do valor de entrada é atribuído ao valor convertido. Se uma expressão sem caractere for convertida em um tipo de dados de caractere, o agrupamento padrão do banco de dados atual será atribuído ao valor convertido. Em ambos os casos, você pode atribuir um agrupamento específico usando a cláusula COLLATE .

Note

As traduções de página de código são suportadas para tipos de dados char e varchar , mas não para o tipo de dados de texto . Como nas versões anteriores do SQL Server, a perda de dados durante as traduções de página de código não é relatada.

As expressões de caracteres que estão sendo convertidas em um tipo de dados numérico aproximado podem incluir notação exponencial opcional. Esta notação é uma minúscula e ou maiúscula E seguida por um sinal opcional de mais (+) ou menos (-) e, em seguida, um número.

As expressões de caracteres que estão sendo convertidas em um tipo de dados numérico exato devem consistir em dígitos, um ponto decimal e um opcional mais (+) ou menos (-). Os espaços em branco à esquerda são ignorados. Separadores de vírgula, como o separador de milhares em 123,456.00, não são permitidos na cadeia de caracteres.

As expressões de caracteres que estão sendo convertidas em tipos de dados money ou smallmoney também podem incluir um ponto decimal opcional e cifrão ($). Separadores de vírgula, como em $123,456.00, são permitidos.

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

Examples

A. Mostrar o valor padrão de n quando usado na declaração de variável

O exemplo a seguir mostra que o valor padrão de n é 1 para os tipos de dados char e varchar , quando usado 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 CAST funções and 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 aplica um formato específico aos dados exibidos. Um tipo de moeda é convertido em dados de caracteres e o estilo 1 é aplicado, que exibe os valores com vírgulas a cada três dígitos à esquerda da vírgula decimal e dois dígitos à direita da vírgula decimal. Um tipo datetime é convertido em dados de caractere e o estilo 3 é aplicado, o que exibe os dados no formato dd/mm/yy. WHERE Na cláusula, um tipo de dinheiro é 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%';

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. Converter dados uniqueidentifier

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 que está sendo convertido. Como o tipo uniqueidentifier é limitado a 36 caracteres, os caracteres que excedem esse comprimento são 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