Tipos de datos en SQL

Lectura
20 min~6 min lectura

📊 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.

CONCEPTO CLAVE: Los tipos de datos en SQL determinan qué clase de valores puede almacenar una columna. Elegir el tipo correcto mejora el rendimiento, ahorra espacio en disco y garantiza la integridad de tus datos.

¿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?
📌 La diferencia entre 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
💡 Consejo práctico: Si sabes que un campo siempre tendrá 10 caracteres (como un código postal español), usa 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
⚠️ Precaución: Los formatos de fecha varían entre sistemas. MySQL usa 'YYYY-MM-DD', mientras que Oracle puede usar 'DD-MON-YY'. ¡Siempre verifica el formato de tu motor de base de datos!

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
);
📌 Nota cómo cada columna tiene un tipo apropiado: 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
Ver más: Tipos de datos especiales

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

  1. Usar VARCHAR sin límite: Siempre especifica un máximo. Sin él, MySQL puede reservar hasta 65,535 bytes por fila.
  2. Elegir FLOAT para dinero: Esto causa errores de redondeo. Siempre usa DECIMAL para valores monetarios.
  3. Confundir CHAR con VARCHAR: CHAR rellena con espacios, VARCHAR no. Para datos que varían en longitud, usa VARCHAR.
  4. Ignorar la zona horaria: Si tu aplicación es internacional, usa TIMESTAMP en lugar de DATETIME para manejar correctamente las zonas horarias.
  5. Olvidar valores NULL: Cuando una columna puede no tener valor, permite NULL explícitamente; de lo contrario, MySQL usa un valor por defecto.
⚠️ Error crítico: Intentar almacenar un valor demasiado grande para una columna cause un error de truncamiento. Por ejemplo, guardar "Barcelona" en CHAR(5) resultará en "Barce" sin previo aviso en algunos sistemas.
"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
);
💡 Buena práctica: Documenta siempre por qué elegiste cada tipo de dato. En seis meses, ni tú ni tus compañeros recordarán por qué el campo teléfono es VARCHAR(20) en lugar de VARCHAR(15).

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;
📌 La conversión implícita (automática) puede ocurrir en comparaciones y operaciones. Por ejemplo, comparar un VARCHAR con un número hace que SQL intente convertir el texto a número, lo cual puede fallar si el texto no es numérico.

Resumen de mejores prácticas

Situación Tipo recomendado
Nombres de personas VARCHAR(100) a VARCHAR(200)
Email 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.

🧠 Quiz

¿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)
✅ Respuesta correcta: B) DECIMAL(10,2). Los salarios son valores monetarios que requieren precisión exacta, por eso DECIMAL es la elección correcta. FLOAT causaría errores de redondeo e INT no permite decimales. VARCHAR es ineficiente y no permite cálculos aritméticos directos.
Ver más: Ejercicios de práctica

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.