char y varchar (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento 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 habilitada para UTF-8, 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. En el caso de 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 podría 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. En el caso de 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 podría 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. Este concepto es similar a la definición de nchar y nvarchar.
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 o CREATE TABLE
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 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 usa en la declaración de variable.
DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';
--The following query 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%';
Este es el 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. 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;
Este es el conjunto de resultados.
String TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0
Contenido relacionado
- nchar y nvarchar (Transact-SQL)
- CAST y CONVERT (Transact-SQL)
- COLLATE (Transact-SQL)
- Conversión de tipos de datos (Motor de base de datos)
- Tipos de datos (Transact-SQL)
- Estimar el tamaño de una base de datos
- Compatibilidad con la intercalación y Unicode
- Juegos de caracteres de un solo byte y de varios bytes