char y varchar (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Los tipos de datos de caracteres son de tamaño fijo, char, o de tamaño variable, varchar. A partir de SQL Server 2019 (15.x), cuando se usa una intercalación con UTF-8 habilitado, estos tipos de datos almacenan el intervalo completo de datos de caracteres Unicode y usan la codificación de caracteres UTF-8. Si se especifica una intercalación cuyo formato no es UTF-8, estos tipos de datos solo almacenan un subconjunto de caracteres admitidos por la página de códigos correspondiente de esa intercalación.

Argumentos

char [ ( n ) ]

Datos de cadena de tamaño fijo. n define el tamaño de la cadena en bytes y debe ser un valor entre 1 y 8000. Para juegos de caracteres de codificación de byte único, como el Latin, el tamaño de almacenamiento es n bytes y el número de caracteres que se pueden almacenar también es n. Para los juegos de caracteres de codificación multibyte, el tamaño de almacenamiento sigue siendo n bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n. El sinónimo ISO para char es character. Para más información sobre los juegos de caracteres, vea Juegos de caracteres de un solo byte y de varios bytes.

varchar [ ( n | max ) ]

Datos de cadena de tamaño variable. Utilice n para definir el tamaño de la cadena en bytes, que puede ser un valor comprendido entre 1 y 8.000, o bien use max para indicar un tamaño de restricción de columna de hasta un almacenamiento máximo de 2^31-1 bytes (2 GB). Para juegos de caracteres de codificación de byte único, como el Latin, el tamaño de almacenamiento es n bytes + 2 bytes y el número de caracteres que se pueden almacenar también es n. Para los juegos de caracteres de codificación multibyte, el tamaño de almacenamiento sigue siendo n bytes + 2 bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n. Los sinónimos ISO para varchar son char varying o character varying. Para más información sobre los juegos de caracteres, vea Juegos de caracteres de un solo byte y de varios bytes.

Observaciones

Una idea equivocada habitual es pensar que, en char(n) y varchar(n), la n define el número de caracteres. Sin embargo, en char(n) y varchar(n), la n define la longitud de la cadena en bytes (de 0 a 8.000). n nunca define números de caracteres que se pueden almacenar. Esto es similar a la definición de nchar(n) y nvarchar(n).

La idea equivocada se debe a que, al usar la codificación de un solo byte, el tamaño de almacenamiento de char y varchar es n bytes y el número de caracteres también es n. Sin embargo, en la codificación de varios bytes como UTF-8, los intervalos Unicode más altos (de 128 a 1.114.111) dan como resultado un carácter que usa dos o más bytes. Por ejemplo, en una columna definida como char(10), el Motor de base de datos puede almacenar 10 caracteres que usan la codificación de un solo byte (intervalo de Unicode de 0 a 127), pero menos de 10 caracteres cuando se usa la codificación de varios bytes (intervalo de Unicode de 128 a 1.114.111). Para obtener más información sobre el almacenamiento Unicode y los intervalos de caracteres, vea Diferencias de almacenamiento entre UTF-8 y UTF-16.

Cuando no se especifica n en una instrucción de definición de datos o de declaración de variable, la longitud predeterminada es 1. Cuando no se especifica n al usar las funciones CAST y CONVERT, la longitud predeterminada es 30.

Los objetos que utilizan char o varchar se asignan a la intercalación predeterminada de la base de datos, a menos que se asigne una intercalación específica por medio de la cláusula COLLATE. La intercalación controla la página de códigos utilizada para almacenar los datos de caracteres.

Las codificaciones multibyte en SQL Server incluyen:

  • Juegos de caracteres de doble byte (DBCS) para algunos lenguajes asiáticos orientales que usan páginas de códigos 936 y 950 (chino), 932 (japonés) o 949 (coreano).

  • UTF-8 con página de códigos 65001.

    Se aplica a: SQL Server 2019 (15.x) y versiones posteriores.

Si tiene sitios que admiten varios idiomas:

  • A partir de SQL Server 2019 (15.x), considere el uso de una intercalación con UTF-8 habilitado para admitir Unicode y minimizar los problemas de conversión de caracteres.
  • Si usa una versión anterior del motor de base de datos de SQL Server, considere la posibilidad de usar los tipos de datos nchar o nvarchar de Unicode para minimizar los problemas de conversión de caracteres.

Si usa char o varchar, se recomienda que:

  • Utilice char cuando los tamaños de las entradas de datos de columna sean coherentes.
  • Use varchar cuando los tamaños de las entradas de datos de columna varíen considerablemente.
  • Utilice varchar(max) cuando los tamaños de las entradas de datos de columna varíen de forma considerable y la longitud de la cadena pueda superar los 8000 bytes.

Si SET ANSI_PADDING es OFF cuando se ejecuta CREATE TABLE o ALTER TABLE, una columna char que se define como NULL se controla como varchar.

Advertencia

Cada columna varchar(max) o nvarchar(max) cuyo valor no sea NULL requiere 24 bytes de asignación fija adicional, que se descuentan del límite de 8.060 bytes de las filas durante una operación de ordenación. Esto puede crear un límite implícito del número de columnas varchar(max) o nvarchar(max) cuyo valor no sea NULL que es posible crear en una tabla.

No se produce ningún error especial cuando se crea la tabla (más allá de la advertencia habitual de que el tamaño máximo de la fila supera el máximo permitido de 8060 bytes) ni en el momento de la inserción de los datos. Este tamaño grande de fila puede provocar errores (como el error 512) durante algunas operaciones normales, como la actualización de claves de un índice agrupado o las ordenaciones del conjunto completo de columnas, que solo se pueden producir cuando se realiza una operación.

Conversión de datos de caracteres

Cuando se convierten expresiones de caracteres a un tipo de datos de caracteres de un tamaño distinto, se truncan los valores que son demasiado grandes para el nuevo tipo de datos. El tipo uniqueidentifier se considera un tipo de carácter para la conversión de una expresión de caracteres y, por tanto, está sujeto a las reglas de truncamiento de la conversión a un tipo de carácter. Consulte la sección Ejemplos.

Cuando una expresión de caracteres se convierte a una expresión de caracteres de un tipo de datos o tamaño distinto (como de char(5) a varchar(5) o de char(20) a char(15) ), se asigna la intercalación del valor de entrada al valor convertido. Si una expresión que no es de carácter se convierte a un tipo de datos de carácter, se asigna al valor convertido la intercalación predeterminada de la base de datos actual. En cualquiera de los casos, puede asignar una intercalación específica mediante la cláusula COLLATE.

Nota

Las traducciones de páginas de códigos se admiten para los tipos de datos char y varchar, pero no para el tipo de datos text. Al igual que en versiones anteriores de SQL Server, las pérdidas de datos durante las traducciones de páginas de códigos no se notifican.

Las expresiones de caracteres que se van a convertir a un tipo de datos numeric aproximado pueden incluir una notación exponencial opcional. Esta notación es una e minúscula o una E mayúscula seguida de un signo opcional más (+) o menos (-) y, después, un número.

Las expresiones de carácter que se convierten a un tipo de datos numeric exacto se componen de dígitos, un separador de decimales y un signo más (+) o menos (-) opcional. Los espacios en blanco iniciales se omiten. No se permiten los separadores de coma (como el separador de miles en 123,456.00) en la cadena.

Las expresiones de caracteres que se convierten a los tipos de datos money o smallmoney también pueden incluir un separador de decimales opcional y un símbolo de dólar ($). Los separadores de coma, como en $123,456.00, están permitidos.

Cuando una cadena vacía se convierte en un int, su valor se convierte en 0. Cuando una cadena vacía se convierte en una fecha, su valor se convierte en el valor predeterminado para la fecha, que es 1900-01-01.

Ejemplos

A. Representación del valor predeterminado de n cuando se usa en una declaración de variable

En el ejemplo siguiente se muestra que el valor predeterminado de n es 1 para los tipos de datos char y varchar cuando se usan en una declaración de variable.

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

B. Representación del valor predeterminado de n cuando se usa varchar con CAST y CONVERT

En el ejemplo siguiente se muestra que el valor predeterminado de n es 30 cuando se usa el tipo de datos char o varchar con las funciones CAST y 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. Conversión de datos para mostrarlos

En el ejemplo siguiente se convierten dos columnas a tipos de caracteres y se aplica un estilo que aplica un formato concreto a los datos mostrados. Un tipo money se convierte en datos de caracteres y se aplica el estilo 1, que muestra los valores con comas cada tres dígitos a la izquierda del separador decimal y cada dos dígitos a la derecha del separador decimal. Un tipo datetime se convierte en datos de caracteres y se aplica el estilo 3, que muestra los datos en el formato dd/mm/yy. En la cláusula WHERE se convierte un tipo money en un tipo de caracteres para realizar una operación de comparación de cadenas.

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

El conjunto de resultados es el siguiente:

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. Conversión de datos uniqueidentifier

En el ejemplo siguiente se convierte un valor uniqueidentifier en un tipo de datos char.

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

En el ejemplo siguiente se muestra el truncamiento de los datos cuando el valor es demasiado largo para el tipo de datos al que se va a convertir. Como el tipo uniqueidentifier tiene un límite de 36 caracteres, se truncan los caracteres que superan esa longitud.

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

El conjunto de resultados es el siguiente:

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

(1 row(s) affected)

Consulte también