tipos-de-datos-sql-server

Tipos de datos en SQL Server

  • 5 min

En bases de datos, un Tipo de Dato es un atributo estructural que define la naturaleza de la información que puede contener una columna, variable o parámetro (como números enteros, texto, fechas o valores monetarios).

Elegir mal los tipos de datos tendrá consecuencias directas en:

  1. Integridad: Un tipo de dato es la primera capa de validación (no puedes guardar “pepino” en un campo INT).
  2. Espacio en disco: Desperdiciamos almacenamiento.
  3. Memoria RAM: SQL Server carga las páginas de datos en memoria.

En este artículo vamos a ver los tipos más importantes que usaremos en el 99% de los casos 👇.

¿Qué tipo elijo?

Para facilitaros la vida, aquí tenéis un resumen de tipos por defecto:

Dato a guardarTipo recomendadoPor qué
ID / Clave PrimariaINTRápido y eficiente.
Nombre, Dirección, EmailNVARCHAR(n)Soporta acentos y caracteres especiales.
Códigos internos (SKU)VARCHAR(n)Generalmente son ASCII y ahorramos espacio.
Precios / DineroDECIMAL(19, 4)Nunca FLOAT. Queremos precisión exacta.
Fechas (sin hora)DATEOcupa poco.
Fecha de registro (Log)DATETIME2Máxima precisión.
Checkbox / FlagsBITEs el booleano de SQL.

Tipos de datos numéricos

SQL Server ofrece una gran variedad de formas de guardar números. La clave está en saber el rango que necesitamos y si requerimos decimales.

Números enteros

Usamos estos tipos cuando sabemos que no habrá decimales (contadores, IDs, cantidades).

Tipo de datoRangoAlmacenamiento
TINYINT0 a 2551 Byte
SMALLINT-32,768 a 32,7672 Bytes
INT-2,147,483,648 a 2,147,483,6474 Bytes
BIGINT-9 trillones a 9 trillones (aprox)8 Bytes

Por defecto usamos INT. Solo usamos:

  • BIGINT si esperamos superar los 2 mil millones de registros (muy común en grandes tablas de logs o históricos),
  • TINYINT para cosas muy pequeñas como “Estados” (1=Activo, 2=Baja).

Aproximados Float o Real

Almacenan el número en notación científica. Son muy eficientes para números gigantescos o minúsculos, pero tienen errores de redondeo.

DECLARE @DistanciaTierraSol FLOAT;
SET @DistanciaTierraSol = 1.496E8; -- 149,600,000 km (Notación científica)

DECLARE @MasaElectron REAL;
SET @MasaElectron = 9.109E-31; -- Un número minúsculo
Copied!
  • Ideal para: Cálculos científicos, física, distancias.
  • Nunca usar para dinero.

Exactos Decimal o Numeric

Almacenan el número exacto. Se definen como DECIMAL(p, s), donde p es la precisión total y s la cantidad de decimales.

DECLARE @Precio DECIMAL(10, 2); -- 8 dígitos enteros, 2 decimales
SET @Precio = 19.99;
Copied!
  • Ideal para: Dinero, contabilidad.

Tipos de datos de texto

Tenemos que decidir entre dos factores: Longitud fija vs variable y Unicode vs ASCII.

Fijo vs Variable (CHAR vs VARCHAR)

  • CHAR(n): Reserva siempre n bytes. Si guardas “Hola” en un CHAR(10), SQL rellenará con 6 espacios al final. Es útil solo si todos los datos tienen la misma longitud (ej: códigos de país ‘ES’, ‘FR’).
  • VARCHAR(n): Es variable. Si guardas “Hola” en un VARCHAR(10), solo usa los bytes de “Hola” más 2 bytes de control. Es el estándar para casi todo.

Unicode vs No-Unicode (La letra ‘N’)

Aquí entra la diferencia entre VARCHAR y NVARCHAR. La N significa National (Unicode).

  • VARCHAR: Usa 1 byte por carácter. Solo admite caracteres estándar (inglés, español básico). Si intentas guardar caracteres chinos o emojis, verás ?.
  • NVARCHAR: Usa 2 bytes por carácter. Admite cualquier carácter del mundo (japonés, árabe, emojis 🚀).

Grandes volúmenes (MAX)

Antiguamente existían tipos llamados TEXT y NTEXT. Están obsoletos. No los uséis. Si necesitáis guardar más de 4000/8000 caracteres (como un artículo de blog completo), usad:

  • VARCHAR(MAX)
  • NVARCHAR(MAX)

Admiten hasta 2GB de datos por fila.

Hoy en día, el espacio en disco es barato. Ante la duda, usa NVARCHAR para evitar problemas con nombres extranjeros o símbolos especiales en el futuro.

Tipos de fecha y hora

Hasta SQL Server 2008, solo teníamos DATETIME. Ahora tenemos opciones más precisas:

  • DATE: Solo fecha (YYYY-MM-DD). Ahorra mucho espacio (3 bytes).
  • TIME: Solo hora (hh:mm.nnnnnnn).
  • DATETIME2: La evolución de DATETIME. Tiene mayor rango (desde el año 0001) y mayor precisión (100 nanosegundos).
  • DATETIME: El clásico. Rango desde 1753. Precisión de 3.33ms. Se mantiene por compatibilidad.
DECLARE @FechaNacimiento DATE = '1990-05-20';
DECLARE @MomentoExacto DATETIME2 = '2023-10-15 14:30:00.1234567';
Copied!

Otros tipos comunes

BIT (Booleanos)

SQL Server no tiene un tipo “BOOLEAN” como tal. Tiene BIT.

  • Valores: 0, 1 o NULL.
  • SQL Server es muy inteligente: si tienes varias columnas BIT en una tabla, las agrupa internamente para que ocupen 1 solo byte por cada 8 columnas.

UNIQUEIDENTIFIER (GUID)

Almacena identificadores globales únicos (UUID/GUID). Son cadenas largas como 6F9619FF-8B86-D011-B42D-00C04FC964FF.

  • Ventaja: Únicos en todo el mundo
  • Desventaja: Ocupan mucho (16 bytes) y son lentos para índices (fragmentación).