📊 Tipos de Datos en SQL
Bienvenido a esta lección fundamental sobre los tipos de datos en SQL. Comprender cómo SQL almacena y maneja diferentes clases de información es esencial para diseñar bases de datos eficientes y evitar errores comunes. Cada base de datos tiene sus propias variantes, pero los conceptos básicos son universales.
¿Por qué importan los tipos de datos?
Imagina que intentas guardar el número de teléfono de un cliente en una columna diseñada para números enteros. El resultado sería catastrófico: perderíamos el primer dígito (los números en España empiezan con +34), los espacios y guiones desaparecerían. Por eso, entender los tipos de datos es crucial.
Categorías principales de tipos de datos
1. Tipos numéricos
SQL ofrece diferentes tipos para manejar información numérica, desde simples contadores hasta cálculos decimales complejos.
| Tipo | Descripción | Ejemplo de uso |
|---|---|---|
INT / INTEGER |
Números enteros sin decimales | Edad, cantidad de productos |
DECIMAL(p,s) |
Números con precisión fija | Precios, salarios (2 decimales) |
FLOAT / REAL |
Números aproximados con decimales | Medidas científicas |
BOOLEAN |
Valores verdadero o falso | ¿Activo?, ¿Es premium? |
DECIMAL y FLOAT es crucial: DECIMAL almacena valores exactos (ideal para dinero), mientras que FLOAT almacena aproximaciones que pueden causar errores de redondeo.
2. Tipos de texto o cadenas
Para almacenar texto, tenemos dos familias principales: longitud fija y longitud variable.
| Tipo | Descripción | Cuándo usarlo |
|---|---|---|
CHAR(n) |
Cadena de longitud FIJA (n caracteres) | Códigos de país, licencias |
VARCHAR(n) |
Cadena de longitud VARIABLE (hasta n) | Nombres, direcciones, emails |
TEXT |
Textos largos sin límite definido | Descripciones, comentarios |
CHAR(10). Si la longitud varía (como nombres), usa VARCHAR con un máximo razonable.
3. Tipos de fecha y hora
SQL proporciona tipos especializados para manejar información temporal, uno de los aspectos más importantes en cualquier base de datos.
| Tipo | Almacena | Ejemplo |
|---|---|---|
DATE |
Solo fecha (año-mes-día) | 2024-03-15 |
TIME |
Solo hora (horas-minutos-segundos) | 14:30:00 |
DATETIME |
Fecha y hora combinadas | 2024-03-15 14:30:00 |
TIMESTAMP |
Fecha, hora y zona horaria | 2024-03-15T14:30:00Z |
Creando tablas con tipos de datos
Veamos cómo aplicar todo esto en la práctica. Crearemos una tabla de ejemplo para una biblioteca:
CREATE TABLE libros (
id_libro INT PRIMARY KEY AUTO_INCREMENT,
titulo VARCHAR(200) NOT NULL,
isbn CHAR(13) NOT NULL,
precio DECIMAL(6,2) NOT NULL,
paginas INT,
fecha_publicacion DATE,
disponible BOOLEAN DEFAULT TRUE,
descripcion TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
VARCHAR(200) para títulos largos, CHAR(13) para ISBNs que siempre tienen 13 dígitos, y DECIMAL(6,2) para precios con exactamente dos decimales.
Tipos de datos según el sistema
Cada motor de base de datos tiene sus particularidades. Aquí te presentamos las equivalencias más comunes:
| Categoría | MySQL | PostgreSQL | SQL Server |
|---|---|---|---|
| Entero pequeño | TINYINT | SMALLINT | SMALLINT |
| Entero grande | BIGINT | BIGINT | BIGINT |
| Moneda | DECIMAL | MONEY | MONEY |
| UUID | CHAR(36) | UUID | UNIQUEIDENTIFIER |
Además de los tipos básicos, existen variantes avanzadas:
- ENUM: Lista de valores permitidos (MySQL)
- JSON: Para almacenar objetos JSON directamente
- ARRAY: Colecciones de elementos (PostgreSQL)
- GEOMETRY: Datos espaciales y geográficos
- BLOB: Datos binarios grandes (imágenes, archivos)
Errores comunes y cómo evitarlos
- Usar VARCHAR sin límite: Siempre especifica un máximo. Sin él, MySQL puede reservar hasta 65,535 bytes por fila.
- Elegir FLOAT para dinero: Esto causa errores de redondeo. Siempre usa DECIMAL para valores monetarios.
- Confundir CHAR con VARCHAR: CHAR rellena con espacios, VARCHAR no. Para datos que varían en longitud, usa VARCHAR.
- Ignorar la zona horaria: Si tu aplicación es internacional, usa TIMESTAMP en lugar de DATETIME para manejar correctamente las zonas horarias.
- Olvidar valores NULL: Cuando una columna puede no tener valor, permite NULL explícitamente; de lo contrario, MySQL usa un valor por defecto.
"Elegir el tipo de dato correcto desde el principio evita meses de refactorización y migración de datos después." — Doctrina de desarrollo de bases de datos
Valores por defecto y NULL
Un concepto fundamental es entender cómo SQL maneja valores especiales:
- NULL: Representa la ausencia de valor. No es cero, no es texto vacío, es "no sabemos" o "no aplica".
- DEFAULT: Valor que se asigna automáticamente si no se proporciona uno durante la inserción.
- NOT NULL: Restricción que impide que la columna acepte valores nulos.
-- Ejemplos de valores por defecto
CREATE TABLE empleados (
id INT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
activo BOOLEAN DEFAULT TRUE,
fecha_alta DATE DEFAULT CURRENT_DATE,
observaciones TEXT NULL -- Puede estar vacío explícitamente
);
Conversión entre tipos
SQL permite convertir datos entre tipos usando CAST o CONVERT:
-- Convertir texto a número
SELECT CAST('123' AS INT) + 10; -- Resultado: 133
-- Convertir número a texto
SELECT CONVERT(precio, CHAR) FROM productos;
-- Convertir fecha a texto con formato
SELECT CONVERT(fecha, CHAR) FROM pedidos;
Resumen de mejores prácticas
| Situación | Tipo recomendado |
|---|---|
| Nombres de personas | VARCHAR(100) a VARCHAR(200) |
| VARCHAR(255) | |
| Edad de personas | TINYINT UNSIGNED (0-255) |
| Precios en euros | DECIMAL(10,2) |
| Coordenadas GPS | DECIMAL(10,8) para latitud, DECIMAL(11,8) para longitud |
| Fechas de nacimiento | DATE |
| Marcas de tiempo | TIMESTAMP |
| Booleanos | BOOLEAN o TINYINT(1) |
Conclusión
Los tipos de datos son el fundamento sobre el cual construyes tus bases de datos. Una elección informada desde el inicio del proyecto te ahorrará problemas de rendimiento, espacio y migración de datos en el futuro.
¿Qué tipo de dato usarías para almacenar el salario mensual de los empleados de una empresa?
- A) FLOAT
- B) DECIMAL(10,2)
- C) INT
- D) VARCHAR(20)
Ejercicio 1: Diseña una tabla para almacenar información de estudiantes con los siguientes campos: ID, nombre completo, número de expediente (8 dígitos), fecha de nacimiento, promedio general (1-10 con 2 decimales), y si está becado.
Ejercicio 2: Crea una tabla para un catálogo de productos electrónicos con: código SKU (formato ABC-12345), nombre del producto, descripción larga, precio en euros, stock actual, fecha de lanzamiento, y si está activo en la tienda.
Ejercicio 3: Explica por qué es incorrecto usar CHAR(1) para almacenar respuestas de sí/no en lugar de BOOLEAN.