Mostramos todos los tipos de datos posibles para una base de datos con motor Microsoft SQL Server 2019. Indicamos los tipos de datos agrupados por categoría, explicando ejemplos de uso y el tamaño de cada uno de ellos.

Definición de tipos de datos en SQL Server 2019

En Microsoft SQL Server, cada columna, variable local, expresión y parámetro tiene un tipo de datos relacionado. Un tipo de datos es un atributo que especifica el tipo de datos que el objeto puede contener: datos de enteros, caracteres, moneda, fecha y hora, cadenas binarias, etc..

SQL Server proporciona un conjunto de tipos de datos del sistema que define todos los tipos de datos que pueden utilizarse con SQL Server. También puede definir sus propios tipos de datos en Transact-SQL o Microsoft .NET Framework. Los tipos de datos de alias están basados en los tipos de datos proporcionados por el sistema.

Cuando dos expresiones que tienen tipos de datos, intercalaciones, precisión, escala o longitud diferentes son combinadas por un operador, las características del resultado vienen determinadas por lo siguiente:

  • El tipo de datos del resultado viene determinado por la aplicación de las reglas de precedencia de tipos de datos a los tipos de datos de las expresiones de entrada.
  • La intercalación del resultado viene determinada por las reglas de precedencia de intercalación cuando el tipo de datos del resultado es char, varchar, text, nchar, nvarchar o ntext.
  • La precisión, escala y longitud del resultado dependen de la precisión, escala y longitud de las expresiones de entrada.

SQL Server proporciona sinónimos de tipos de datos para la compatibilidad con ISO.

Tipos de datos en SQL Server 2019

A continuación mostramos, agrupados por categorías (numéricos exactos, numéricos aproximados, fecha y hora, cadenas de caracteres, cadenas de caracteres Unicode, cadenas binarias, otros tipos de datos).

Números exactos

Tipos de datos numéricos exactos que utilizan datos enteros. Para ahorrar espacio en la base de datos, se debe usar el tipo de datos más pequeño que puede contener todos los valores posibles de manera confiable. Por ejemplo, para un campo que guarde la edad de una persona, sería suficiente con tinyint, dado que una persona no vivirá más de 255 años.

Tipo de datosIntervaloAlmacenamiento
bigintDe -2^63 (-9.223.372.036.854.775.808) a 2^63-1 (9.223.372.036.854.775.807)8 bytes
intDe -2^31 (-2.147.483.648) a 2^31-1 (2.147.483.647)4 bytes
smallintDe -2^15 (-32.768) a 2^15-1 (32.767)2 bytes
tinyintDe 0 a 2551 byte
numeric[ ( p[ , s] ) ]Números de precisión y escala fijas. Cuando se utiliza la precisión máxima, los valores válidos se sitúan entre – 10^38 +1 y 10^38 – 1. Los sinónimos ISO para decimal son dec y dec( p, s ) . numeric es funcionalmente idéntico a decimal.
p (precisión): el número total máximo de dígitos decimales que se almacenarán. Este número incluye los lados derecho e izquierdo del separador decimal. La precisión debe ser un valor comprendido entre 1 y la precisión máxima de 38. La precisión predeterminada es 18.
s (escala): el número de dígitos decimales que se almacenarán a la derecha del separador decimal. Este número se extrae de p para determinar el número máximo de dígitos a la izquierda del separador decimal. La escala debe ser un valor comprendido entre 0 y p, y solo se puede especificar si se especifica la precisión. La escala predeterminada es 0, por lo que 0 < = s <= p. Los tamaños de almacenamiento máximo varían según la precisión.
Según la precisión:
1 – 9: 5 bytes
10-19: 9 bytes
20-28: 13 bytes
29-38: 17 bytes
decimal[ ( p[ , s] ) ]idéntico a numeric[ ( p[ , s] ) ]
moneyDe -922.337.203.685.477,5808 a 922.337.203.685.477,58078 bytes
smallmoneyDe – 214.748,3648 a 214.748,36474 bytes
bitTipo de datos entero que puede aceptar los valores 1, 0 o NULL1 bit

El tipo de datos int es el principal tipo de datos de valores enteros de SQL Server. El tipo de datos bigint está pensado para usarse cuando los valores enteros pueden exceder el intervalo admitido por el tipo de datos int. bigint se encuentra entre smallmoney y int en el gráfico de prioridad de tipo de datos.

Los tipos de datos money y smallmoney tienen una precisión de una diezmilésima de las unidades monetarias que representan. En Informática, los tipos de datos money y smallmoney tienen una precisión de una centésima de las unidades monetarias que representan. Use un punto para separar las unidades parciales de moneda, como céntimos, de las unidades completas de moneda. Por ejemplo, 2.15 puede especificar 2 dólares y 15 centavos.

Tipos de datos numéricos que tienen precisión y escala fijas. Los tipos decimal y numeric son tipos de datos numéricos de precisión y escala fijas y son sinónimos, se pueden usar indistintamente.

El Motor de base de datos de SQL Server optimiza el almacenamiento de las columnas de tipo bit. Si hay menos de ocho columnas de tipo bit en una tabla, las columnas se almacenan como 1 byte. Si hay entre 9 y 16 columnas de tipo bit, se almacenan como 2 bytes, y así sucesivamente. Los valores de cadena TRUE y FALSE se pueden convertir en valores de tipo bit: TRUE se convierte en 1 y FALSE en 0. La conversión a bit promueve cualquier valor distinto de cero a uno.

Números aproximados

Tipos de datos numéricos y aproximados que se utilizan con datos numéricos de coma flotante. Los datos de coma flotante son aproximados; por tanto, no todos los valores del rango del tipo de datos se pueden representar con exactitud. El sinónimo ISO para real es float(24) .

Tipo de datosIntervaloAlmacenamiento
floatDe – 1,79E+308 a -2,23E-308, 0 y de 2,23E-308 a 1,79E+308Depende del valor de n
realDe – 3,40E + 38 a -1,18E – 38, 0 y de 1,18E – 38 a 3,40E + 384 bytes

Sintaxis para float

float [ ( n ) ], donde n es el número de bits que se usan para almacenar la mantisa del número de float en notación científica y, por tanto, dicta su precisión y el tamaño de almacenamiento. Si se especifica n, debe ser un valor entre 1 y 53. El valor predeterminado de n es 53.

Valor nPrecisiónAlmacenamiento
1-247 dígitos4 bytes
25-5315 dígitos8 bytes

SQL Server trata n como uno de dos valores posibles. Si 1<=n<=24, n se trata como 24. Si 25<=n<=53, n se trata como 53.

El tipo de datos SQL Server float[ (n) ] cumple con el estándar ISO para todos los valores de n desde 1 hasta 53. El sinónimo de double precision es float(53) .

Fecha y hora

Tipo de datosIntervaloAlmacenamiento
dateDe 0001-01-01 a 9999-12-31 (de 1582-10-15 a 9999-12-31 para Informática).
Del 1 de enero del año 1 E. C. al 31 de diciembre de 9999 E. C. (del 15 de octubre de 1582 E. C. al 31 de diciembre de 9999 E. C. para Informática)
3 bytes, fijo
datetimeDefine una fecha que se combina con una hora del día con fracciones de segundos basada en un reloj de 24 horas.
Del 01.01.53 hasta el 31.12.99.
De 00:00:00 a 23:59:59,997
8 bytes
smalldatetimeDefine una fecha que se combina con una hora del día. La hora está en un formato de día de 24 horas , con segundos siempre a cero (: 00) y sin fracciones de segundo.
De 1900-01-01 a 2079-06-06.
Del 1 de enero de 1900 hasta el 6 de junio de 2079.
De 00:00:00 a 23:59:59.
2007-05-09 23:59:59 se redondeará a 2007-05-10 00:00:00
4 bytes, fijo
datetime2Define una fecha que se combina con una hora del día basada en un reloj de 24 horas. datetime2 se puede considerar como una extensión del tipo datetime existente que tiene un rango de fechas mayor, un valor predeterminado mayor de precisión fraccionaria y una precisión opcional especificada por el usuario.
De 0001-01-01 a 31.12.99.
Del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999.
De 00:00:00 a 23:59:59.9999999
De 0 a 7 dígitos, con una precisión de 100 ns. La precisión predeterminada es 7 dígitos
timeDefine una hora de un día. La hora no distingue la zona horaria y está basada en un reloj de 24 horas.
De 00:00:00.0000000 a 23:59:59.9999999 (de 00:00:00.000 a 23:59:59.999 en Informática)
5 bytes (fijo) es el valor predeterminado con el valor predeterminado de 100 ns de precisión de fracciones de segundo. En Informática, el valor predeterminado es 4 bytes y fijo, con el valor predeterminado de 1 ms de precisión de fracciones de segundo
datetimeoffsetDefine una fecha que se combina con una hora del día con reconocimiento de zona horaria y basado en un reloj de 24 horas.
De 0001-01-01 a 31.12.99

Del 1 de enero del año 1 E. C. al 31 de diciembre de 9999 E. C.
De 00:00:00 a 23:59:59.9999999.
De -14:00 a +14:00
6 bytes para una precisión inferior a 3.
7 bytes para las precisiones 3 y 4.
Todas las demás precisiones requieren 8 bytes

Cadenas de caracteres

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.

Tipo de datosIntervalo
charchar [ ( 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 latino, 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
varcharvarchar [ ( 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 8000, o bien use max para indicar un tamaño de restricción de columna hasta un almacenamiento máximo de 2^31-1 bytes (2 GB). Para juegos de caracteres de codificación de byte único, como el latino, 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 charvarying o charactervarying
text, ntext, imageTipos de datos de longitud fija y variable para almacenar valores de gran tamaño con datos de caracteres y binarios Unicode y no Unicode. Los datos Unicode utilizan el juego de caracteres UNICODE UCS-2.
Los tipos de datos ntext, text e image se quitarán en una versión futura de SQL Server. Evite su uso en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que los usan actualmente.
ntext: datos Unicode de longitud variable con una longitud máxima de cadena de 2^30 – 1 (1.073.741.823) bytes. El tamaño de almacenamiento, en bytes, es dos veces la longitud de cadena especificada. El sinónimo en ISO de ntext es national text.
text: datos no Unicode de longitud variable en la página de códigos del servidor y con una longitud máxima de cadena de 2^31-1 (2.147.483.647). Cuando la página de códigos del servidor utiliza caracteres de doble byte, el almacenamiento sigue siendo de 2.147.483.647 bytes. Dependiendo de la cadena de caracteres, el espacio de almacenamiento puede ser inferior a 2.147.483.647 bytes.
image: datos binarios de longitud variable desde 0 hasta 2^31-1 (2.147.483.647) bytes

Una idea equivocada habitual es pensar que en CHAR(n) y VARCHAR(n), la n define el número de caracteres. Pero en CHAR(n) y VARCHAR(n) la n define la longitud de la cadena en bytes (0-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 produce porque cuando se usa la codificación de un solo byte, el tamaño de almacenamiento de CHAR y VARCHAR es de n bytes y el número de caracteres también es n.

Sin embargo, para la codificación de varios bytes como UTF-8, los intervalos Unicode más altos (128-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), Motor de base de datos puede almacenar 10 caracteres que usan la codificación de un solo byte (intervalo de Unicode 0-127), pero menos de 10 caracteres cuando se usa la codificación de varios bytes (intervalo de Unicode 128-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.

Cadenas de caracteres Unicode

Los tipos de datos de caracteres son de tamaño fijo, nchar, o de tamaño variable, nvarchar. A partir de SQL Server 2012 (11.x), cuando se usa una intercalación con carácter complementario (SC) habilitado, estos tipos de datos almacenan el intervalo completo de datos de caracteres Unicode y usan la codificación de caracteres UTF-16. Si se especifica una intercalación que no es de tipo SC, estos tipos de datos almacenan solo el subconjunto de datos de caracteres admitidos por la codificación de caracteres UCS-2.

Tipo de datosIntervalo
nchar [ ( n ) ]Datos de cadena de tamaño fijo. n define el tamaño de la cadena en pares de bytes y debe ser un valor entre 1 y 4000. El tamaño de almacenamiento es dos veces n bytes. Para la codificación UCS-2, el tamaño de almacenamiento es el doble de n bytes y el número de caracteres que se pueden almacenar también en n. Para la codificación UTF-16, el tamaño de almacenamiento sigue siendo el doble de n bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n porque los caracteres complementarios usan dos pares de bytes (también denominados par suplente). Los sinónimos ISO de nchar son national char y national character.
nvarchar [ ( n | max ) ]Datos de cadena de tamaño variable. n define el tamaño de la cadena en pares de bytes y puede ser un valor entre 1 y 4000. max indica que el tamaño máximo de almacenamiento es de 2^30-1 caracteres (2 GB). El tamaño de almacenamiento es el doble de n bytes + 2 bytes. Para la codificación UCS-2, el tamaño de almacenamiento es el doble de n bytes + 2 bytes y el número de caracteres que se pueden almacenar también en n. Para la codificación UTF-16, el tamaño de almacenamiento sigue siendo el doble de n bytes + 2 bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n porque los caracteres complementarios usan dos pares de bytes (también denominados par suplente). Los sinónimos ISO de nvarchar son national char varying y national character varying.

Cadenas binarias

Tipos de datos binarios de longitud fija o variable.

Tipo de datosIntervalo
binary [ (n) ]Datos binarios de longitud fija con una longitud de n bytes, donde n es un valor que oscila entre 1 y 8000. El tamaño de almacenamiento es de n bytes.
varbinary [ (n | max) ]Datos binarios de longitud variable. n puede ser un valor de 1 a 8000. max indica que el tamaño máximo de almacenamiento es de 2^31-1 bytes. El tamaño de almacenamiento es la longitud real de los datos especificados + 2 bytes. Los datos especificados pueden tener una longitud de 0 bytes. El sinónimo de ANSI SQL para varbinary es binary varying.
imageDatos binarios de longitud variable desde 0 hasta 2^31-1 (2.147.483.647) bytes.

Cuando no se especifica n en una instrucción de definición de datos o de declaración de variables, la longitud predeterminada es 1. Cuando no se especifica n con la función CAST, la longitud predeterminada es 30.

Tipo de datosUsar cuando…
binaryLos tamaños de las entradas de datos de columna sean coherentes
varbinaryLos tamaños de las entradas de datos de columna varíen considerablemente
varbinary(max)Las entradas de datos de columna superen los 8000 bytes

Otros tipos de datos

Tipo de datosIntervalo
cursorUn tipo de datos para las variables o para los parámetros de resultado de los procedimientos almacenados que contiene una referencia a un cursor
hierarchyidEl tipo de datos hierarchyid es un tipo de datos del sistema de longitud variable. Use hierarchyid para representar la posición en una jerarquía. Una columna de tipo hierarchyid no representa automáticamente un árbol. Dependerá de la aplicación generar y asignar los valores hierarchyid de tal forma que la relación deseada entre las filas se refleje en los valores.
Un valor del tipo de datos hierarchyid representa una posición en una jerarquía de árbol.
Muy compactos: el número medio de bits necesarios para representar un nodo en un árbol con n nodos depende del promedio de distribución ramificada secundarios (el promedio de elementos secundarios de un nodo). Para distribuciones ramificadas pequeñas (0-7), el tamaño es aproximadamente 6*logAn bits, donde A es el promedio de distribución ramificada. Un nodo en una jerarquía organizativa de 100.000 personas con un promedio de nodos secundarios de 6 niveles supone aproximadamente 38 bits. Esto se redondea a 40 bits (o 5 bytes) para el almacenamiento.
La comparación se realiza con prioridad a la profundidad. Dados dos valores hierarchyid a y b, a<b significa que a viene antes que b en un corte transversal de prioridad a la profundidad del árbol. Los índices de los tipos de datos hierarchyid están en orden con prioridad a la profundidad y los nodos cercanos entre sí en un corte transversal de prioridad a la profundidad se almacenan casi uno junto a otro. Por ejemplo, los elementos secundarios de un registro se almacenan adyacentes a ese registro. Para más información, vea Datos jerárquicos (SQL Server).
Compatibilidad con inserciones y eliminaciones arbitrarias. Con el método GetDescendant siempre es posible generar un miembro del mismo nivel a la derecha de cualquier nodo determinado, a la izquierda de cualquier nodo determinado, o entre dos miembros cualesquiera del mismo nivel. Se mantiene la propiedad comparison cuando se inserta o elimina un número arbitrario de nodos de la jerarquía. La mayoría de las inserciones y eliminaciones conservan la propiedad compactness. Sin embargo, las inserciones entre dos nodos generarán valores hierarchyid con una representación ligeramente menos compacta.
La codificación usada en el tipo hierarchyid está limitada a 892 bytes. Por consiguiente, el tipo hierarchyid no podrá representar los nodos con demasiados niveles en su representación como para caber en los 892 bytes.
uniqueidentifierEs un GUID de 16 bytes. Una columna o una variable local de tipo de datos uniqueidentifier se puede inicializar en un valor de las siguientes formas:
Mediante el uso de las funciones NEWID o NEWSEQUENTIALID.
Mediante la conversión a partir de una constante de cadena con el formato xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, donde cada x es un dígito hexadecimal en el intervalo 0-9 o a-f.
Con los valores uniqueidentifier se pueden usar operadores de comparación. No obstante, no se implementa la ordenación mediante la comparación de los patrones de bits de los dos valores. Las únicas operaciones que se pueden realizar con un valor uniqueidentifier son comparaciones (=, <>, <, >, <=, >=) y comprobaciones para NULL (IS NULL e IS NOT NULL). No es posible utilizar otros operadores aritméticos. Con el tipo de datos uniqueidentifier se pueden usar todas las propiedades y restricciones de columna, excepto IDENTITY.
sql_variantTipo de datos que almacena valores de varios tipos de datos admitidos en SQL Server.
sql_variant puede usarse en columnas, parámetros, variables y los valores devueltos de las funciones definidas por el usuario. sql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datos.
Una columna de tipo sql_variant puede contener filas de tipos de datos diferentes. Por ejemplo, una columna definida como sql_variant puede almacenar valores int, binario y char.
sql_variant puede tener una longitud máxima de 8016 bytes. Esto incluye la información y el valor de tipo base. La longitud máxima del tipo base real es 8.000 bytes.
rowversionEs un tipo de datos que expone números binarios únicos generados automáticamente en una base de datos. rowversion se suele usar como mecanismo para marcar la versión de las filas de la tabla. El tamaño de almacenamiento es de 8 bytes. El tipo de datos rowversion es simplemente un número que se incrementa y no conserva una fecha o una hora. Para registrar una fecha o una hora, use un tipo de datos datetime2.
xmlEs el tipo de datos que almacena datos de XML. Puede almacenar instancias de xml en una columna o una variable de tipo xml.
Tipos de geometría espacialEl tipo de datos espaciales planares, geometry, se implementa como un tipo de datos CLR (Common Language Runtime) en SQL Server. Este tipo representa datos en un sistema de coordenadas euclídeo (plano).
SQL Server admite un conjunto de métodos para el tipo de datos espaciales geography. Este métodos incluyen a su vez métodos de geometry definidos por el estándar Open Geospatial Consortium (OGC) y un conjunto de extensiones de Microsoft para dicho estándar.
La tolerancia de error para los métodos geometry puede ser de hasta 1,0e-7 * extensiones. Las extensiones hacen referencia a la distancia máxima aproximada entre los puntos del objeto geometry.
El tipo geometry está predefinido y está disponible en cada base de datos. Puede crear columnas de tabla de tipo geometry y operar con los datos geometry de la misma manera que con los demás tipos CLR. Se puede utilizar en columnas calculadas persistentes y no persistentes.
Tipos de geografía espacialEl tipo de datos de geografía espacial, geography, se implementa como un tipo de datos de .NET CLR (Common Language Runtime) en SQL Server. Este tipo representa los datos en un sistema de coordenadas de tierra redonda. El tipo de datos SQL Server geography almacena datos elipsoidales (globo), como coordenadas de latitud y longitud de GPS.
SQL Server admite un conjunto de métodos para el tipo de datos espacial geography. Se incluyen los métodos de geography definidos por el estándar Open Geospatial Consortium (OGC) y un conjunto de extensiones de Microsoft a dicho estándar.
La tolerancia de error para los métodos geography puede ser de hasta 1,0e-7 * extensiones. Las extensiones hacen referencia a la distancia máxima aproximada entre los puntos del objeto geography.
El tipo geography está predefinido y está disponible en cada base de datos. Puede crear columnas de tabla de tipo geography y operar con los datos geography de la misma manera que con los demás tipos proporcionados por el sistema. Se puede utilizar en columnas calculadas persistentes y no persistentes.
tableEs un tipo de datos especial usado para almacenar un conjunto de resultados y procesarlo en otro momento. table se usa principalmente para almacenar temporalmente un conjunto de filas que se devuelven como el conjunto de resultados de la función con valores de tabla. Las funciones y las variables se pueden declarar como de tipo table. Las variables table se pueden usar en funciones, procedimientos almacenados y lotes. Para declarar variables de tipo table, use DECLARE @local_variable.