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:
- Integridad: Un tipo de dato es la primera capa de validación (no puedes guardar “pepino” en un campo
INT). - Espacio en disco: Desperdiciamos almacenamiento.
- 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 guardar | Tipo recomendado | Por qué |
|---|---|---|
| ID / Clave Primaria | INT | Rápido y eficiente. |
| Nombre, Dirección, Email | NVARCHAR(n) | Soporta acentos y caracteres especiales. |
| Códigos internos (SKU) | VARCHAR(n) | Generalmente son ASCII y ahorramos espacio. |
| Precios / Dinero | DECIMAL(19, 4) | Nunca FLOAT. Queremos precisión exacta. |
| Fechas (sin hora) | DATE | Ocupa poco. |
| Fecha de registro (Log) | DATETIME2 | Máxima precisión. |
| Checkbox / Flags | BIT | Es 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 dato | Rango | Almacenamiento |
|---|---|---|
TINYINT | 0 a 255 | 1 Byte |
SMALLINT | -32,768 a 32,767 | 2 Bytes |
INT | -2,147,483,648 a 2,147,483,647 | 4 Bytes |
BIGINT | -9 trillones a 9 trillones (aprox) | 8 Bytes |
Por defecto usamos INT. Solo usamos:
BIGINTsi esperamos superar los 2 mil millones de registros (muy común en grandes tablas de logs o históricos),TINYINTpara 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
- 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;
- 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 siemprenbytes. Si guardas “Hola” en unCHAR(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 unVARCHAR(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 deDATETIME. 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';
Otros tipos comunes
BIT (Booleanos)
SQL Server no tiene un tipo “BOOLEAN” como tal. Tiene BIT.
- Valores:
0,1oNULL. - SQL Server es muy inteligente: si tienes varias columnas
BITen 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).
