Tipos de datos en SQL Server
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 datos Intervalo Almacenamiento
De -2^63 (-[Link].854.775.808) a 2^63-1
bigint ([Link].854.775.807) 8 bytes
De -2^31 (-[Link]) a 2^31-1
int ([Link]) 4 bytes
smallint De -2^15 (-32.768) a 2^15-1 (32.767) 2 bytes
tinyint De 0 a 255 1 byte
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 Según la precisión:
separador decimal. La escala debe ser un valor 1 – 9: 5 bytes
comprendido entre 0 y p, y solo se puede 10-19: 9 bytes
especificar si se especifica la precisión. La escala 20-28: 13 bytes
numeric[ ( p[ , s] ) ] predeterminada es 0, por lo que 0 < = s <= p. Los 29-38: 17 bytes
Tipo de datos Intervalo Almacenamiento
tamaños de almacenamiento máximo varían según
la precisión.
decimal[ ( p[ , s] ) ] idéntico a numeric[ ( p[ , s] ) ]
De -[Link].477,5808 a
money [Link].477,5807 8 bytes
smallmoney De – 214.748,3648 a 214.748,3647 4 bytes
Tipo de datos entero que puede aceptar los valores
bit 1, 0 o NULL 1 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 datos Intervalo Almacenamiento
De – 1,79E+308 a -2,23E-308, 0 y de 2,23E-
float 308 a 1,79E+308 Depende del valor de n
De – 3,40E + 38 a -1,18E – 38, 0 y de 1,18E
real – 38 a 3,40E + 38 4 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 n Precisión Almacenamiento
1-24 7 dígitos 4 bytes
25-53 15 dígitos 8 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 datos Intervalo Almacenamiento
De 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
date diciembre de 9999 E. C. para Informática) 3 bytes, fijo
Tipo de datos Intervalo Almacenamiento
Define 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.
datetime De 00:00:00 a 23:59:59,997 8 bytes
Define 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
smalldatetime 00:00:00 4 bytes, fijo
Define 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 0 a 7 dígitos, con
De 0001-01-01 a 31.12.99. una precisión de 100
Del 1 de enero del año 1 después de Cristo al 31 de ns. La precisión
diciembre de 9999. predeterminada es 7
datetime2 De 00:00:00 a 23:59:59.9999999 dígitos
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
Define una hora de un día. La hora no distingue la valor predeterminado
zona horaria y está basada en un reloj de 24 horas. de 1 ms de precisión
De 00:00:00.0000000 a 23:59:59.9999999 (de de fracciones de
time 00:00:00.000 a 23:59:59.999 en Informática) segundo
Define una fecha que se combina con una hora del
día con reconocimiento de zona horaria y basado en 6 bytes para una
un reloj de 24 horas. precisión inferior a 3.
De 0001-01-01 a 31.12.99 7 bytes para las
precisiones 3 y 4.
datetimeoffset Del 1 de enero del año 1 E. C. al 31 de diciembre de Todas las demás
Tipo de datos Intervalo Almacenamiento
9999 E. C. precisiones requieren
De 00:00:00 a 23:59:59.9999999. 8 bytes
De -14:00 a +14:00
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 datos Intervalo
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 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
char sinónimo ISO para char es character
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 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
varchar para varchar son charvarying o charactervarying
Tipos 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
text, ntext, image Unicode utilizan el juego de caracteres UNICODE UCS-2.
Tipo de datos Intervalo
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 ([Link]) 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 ([Link]).
Cuando la página de códigos del servidor utiliza caracteres de doble byte,
el almacenamiento sigue siendo de [Link] bytes. Dependiendo de
la cadena de caracteres, el espacio de almacenamiento puede ser inferior a
[Link] bytes.
image: datos binarios de longitud variable desde 0 hasta 2^31-1
([Link]) 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 datos Intervalo
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
nchar [ ( n ) ] de nchar son national char y national character.
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
nvarchar [ ( n denominados par suplente). Los sinónimos ISO de nvarchar son national
| max ) ] char varying y national character varying.
Cadenas binarias
Tipos de datos binarios de longitud fija o variable.
Tipo de datos Intervalo
Datos binarios de longitud fija con una longitud de n bytes, donde n es un
binary [ (n) ] valor que oscila entre 1 y 8000. El tamaño de almacenamiento es de n bytes.
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
varbinary [ especificados + 2 bytes. Los datos especificados pueden tener una longitud de
(n | max) ] 0 bytes. El sinónimo de ANSI SQL para varbinary es binary varying.
Datos binarios de longitud variable desde 0 hasta 2^31-1 ([Link])
image 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 datos Usar cuando…
binary Los tamaños de las entradas de datos de columna sean coherentes
Los tamaños de las entradas de datos de columna varíen
varbinary considerablemente
varbinary(max) Las entradas de datos de columna superen los 8000 bytes
Otros tipos de datos
Tipo de datos Intervalo
Un tipo de datos para las variables o para los parámetros de resultado de
cursor los procedimientos almacenados que contiene una referencia a un cursor
El 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
hierarchyid jerarquía de árbol.
Tipo de datos Intervalo
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.
Es 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 xxxxxxxx–xxxx–xxxx–xxxx–xxxxxxxxxxxx, 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
uniqueidentifier NULL e IS NOT NULL). No es posible utilizar otros operadores
Tipo de datos Intervalo
aritméticos. Con el tipo de datos uniqueidentifier se pueden usar
todas las propiedades y restricciones de columna, excepto IDENTITY.
Tipo 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
sql_variant tipo base real es 8.000 bytes.
Es 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
rowversion datos datetime2.
Es el tipo de datos que almacena datos de XML. Puede almacenar
xml instancias de xml en una columna o una variable de tipo xml.
El 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
Tipos de geometría datos geometry de la misma manera que con los demás tipos CLR. Se
espacial puede utilizar en columnas calculadas persistentes y no persistentes.
El 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
Tipos de geografía tierra redonda. El tipo de datos SQL Server geography almacena datos
espacial elipsoidales (globo), como coordenadas de latitud y longitud de GPS.
Tipo de datos Intervalo
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.
Es 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
table DECLARE @local_variable.