Inicio · Blog · datos-sistemas/migrar-base-datos

datos-sistemas/migrar-base-datos

Migrar Excel a MySQL: guía operativa sin pérdida

Guía técnica para migrar Excel a MySQL sin perder datos: limpieza, schema, import via CSV o Python, validación fila a fila. Lo que sí funciona en producción.

Pablo Estrada · 11 de mayo de 2026 · 5 min de lectura
Migrar Excel a MySQL: guía operativa sin pérdida

Migrar una base de datos de Excel a MySQL toma tres pasos: limpieza de tipos en origen, definición de schema en destino, e importación con validación fila a fila. Para archivos chicos basta LOAD DATA INFILE; para volúmenes grandes (más de 100,000 filas), un script Python con pandas más sqlalchemy escala mejor y permite chunking, retries y verificación. Cuando los datos se unifican, los problemas se anuncian solos.

El método correcto en 5 pasos

No te saltes pasos: la mayoría de las migraciones fallan en el paso 2, no en el 5.

  1. Limpia el Excel en origen (tipos, fechas, nulos, encabezados)
  2. Define el schema MySQL antes de importar (no después)
  3. Exporta a CSV con UTF-8 y delimitador consistente
  4. Importa con la herramienta adecuada al volumen
  5. Valida fila a fila comparando conteos, sumas y muestras

Paso 1: limpieza en Excel antes de exportar

Errores típicos que rompen tu migración:

  • Fechas como texto ("01/03/2026") mezcladas con fechas numéricas
  • Números con espacios o comas como separador de miles
  • Celdas con fórmulas que devuelven errores (#DIV/0!, #N/A)
  • Encabezados con espacios, acentos o caracteres especiales
  • Hojas combinadas con saltos visuales que rompen la estructura tabular

Acciones concretas en Excel:

  • Reemplaza encabezados con snake_case sin acentos (fecha_pago, no "Fecha de Pago")
  • Convierte fechas a formato ISO 8601 (2026-03-01)
  • Reemplaza errores de fórmula con celdas vacías
  • Elimina filas y columnas en blanco al final
  • Si tienes hojas múltiples con relaciones, exporta cada una como CSV separado

Paso 2: definir el schema MySQL

No dejes que MySQL adivine tipos. Define la tabla explícitamente:

CREATE TABLE clientes (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(255) NOT NULL,
  email VARCHAR(255),
  fecha_alta DATE,
  monto_total DECIMAL(12,2),
  activo TINYINT(1) DEFAULT 1,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Reglas operativas:

  • VARCHAR(255) para textos cortos; TEXT solo si superas los 255 caracteres
  • DECIMAL en lugar de FLOAT para montos (evita errores de precisión)
  • DATE para fechas, DATETIME solo si necesitas hora
  • TINYINT(1) para booleanos
  • Índices únicos en campos clave (email, RFC, NIT) desde el inicio

Paso 3: exportar a CSV correctamente

Desde Excel: Archivo, Guardar como, CSV UTF-8 (delimitado por comas). Si tu archivo tiene acentos o caracteres especiales, usa CSV UTF-8, nunca CSV Windows (1252).

Verificación rápida del CSV resultante:

  • Abre con un editor de texto plano (no Excel)
  • Confirma que la primera línea tiene los encabezados que esperas
  • Revisa que las fechas se vean en formato ISO
  • Verifica que no haya celdas combinadas como filas vacías intermedias

Paso 4: importar según volumen

Opción A: phpMyAdmin (hasta 10,000 filas)

Sube el CSV directo desde la pestaña Importar de la tabla destino. Configura: formato CSV, separador coma, encerrado entre comillas dobles, líneas terminadas en auto.

Opción B: LOAD DATA INFILE (10,000 a 1M filas)

LOAD DATA LOCAL INFILE '/tmp/clientes.csv'
INTO TABLE clientes
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(nombre, email, @fecha_alta, monto_total, activo)
SET fecha_alta = STR_TO_DATE(@fecha_alta, '%Y-%m-%d');

Es 10 a 100 veces más rápido que INSERT por fila. Necesitas habilitar local_infile=1 en my.cnf.

Opción C: Python con pandas (más de 1M filas o validación seria)

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://user:pass@host/db")
chunks = pd.read_csv("clientes.csv", chunksize=50000)

for chunk in chunks:
    chunk.to_sql("clientes", engine, if_exists="append", index=False)

Ventajas: chunking, control de tipos, manejo de errores, retries automáticos, logging por chunk.

El caso real: 3.6M filas migradas en 48 horas

Una distribuidora multi-país (case_001) llegó con 13M filas legacy en SQL Server 2019 (no Excel, pero el principio aplica), 197 tablas inconsistentes y 10 años de datos desorganizados. El reto era unificarlos en un solo Data Lake operativo con verificación fila a fila.

Lo que se construyó:

  • Snapshot worker Python con PyArrow más psycopg2 más chunking paralelo por PK range
  • 8 chunks paralelos, batch de 50K filas, throttle de 10 queries por segundo
  • 3.6M filas migradas a Supabase en 48 horas
  • 1.17 TB en GCS (Bronze parquet raw)
  • 197 tablas snapshot más 825 vistas Silver más 75 tablas Gold materializadas
  • Verificación fila a fila: source igual a bronze igual a silver igual a gold

El principio es transferible a cualquier migración Excel a MySQL: paralelizar por chunks, validar conteos, no asumir nada.

Paso 5: validación post-migración

Tres queries que toda migración debe pasar antes de declararse exitosa:

-- 1. Conteo total debe coincidir con el CSV
SELECT COUNT(*) FROM clientes;

-- 2. Suma de columnas numéricas clave
SELECT SUM(monto_total) FROM clientes;

-- 3. Verificación de valores nulos inesperados
SELECT COUNT(*) FROM clientes WHERE fecha_alta IS NULL;

Compara los tres números con el Excel de origen. Si alguno difiere, no avances a producción. La diferencia más común: filas eliminadas por encoding malformado o por restricciones NOT NULL violadas silenciosamente.

Errores típicos que rompen la migración

  • Encoding latin1 vs utf8mb4 (acentos rotos, emojis perdidos)
  • Fechas en formato MM/DD/YYYY interpretadas como DD/MM/YYYY
  • Decimales con coma como separador (1.234,56) que MySQL no parsea
  • Encabezados con espacios que generan errores en columnas
  • Auto-increment IDs que se sobreponen si haces append en tabla existente

¿Tu Excel cruzó el umbral donde ya no es Excel?

Si tu archivo pasa los 100,000 registros, tienes más de 5 personas editándolo simultáneamente, o tu negocio depende de él para decisiones, ya no es una hoja de cálculo: es una base de datos sin disciplina. Lo que antes tomaba 30 ingenieros y 18 meses lo entregamos en semanas, y empieza con migrar ese Excel a MySQL o PostgreSQL serio.

Próximos pasos

Si tu Excel es chico (menos de 50,000 filas) y haces migraciones puntuales, phpMyAdmin o MySQL Workbench resuelven en minutos. Si manejas múltiples hojas con relaciones, volúmenes grandes o necesitas validación seria, escribe el pipeline Python.

Si tu pyme tiene 5 a 15 sistemas desconectados con Excel como pegamento (un escenario clásico en LATAM), agenda una llamada con Catalizadora. MAGIA Core construye Data Lake unificado en 12 semanas con migración de todas tus hojas y bases legacy, validación fila a fila, y código a tu nombre por 15,000 USD únicos. Llamada de 30 min, sin pitch deck, conversación real sobre tu operación. Para profesionales individuales, MAGIA Solo entrega base de datos lista en 15 días por 4,500 USD.

Cómo te ayuda Catalizadora

Construimos sistemas con IA a la medida, con el código 100% tuyo. Elige por dónde empezar:

  • MAGIA Solo — marca, sitio, CRM y asistente con IA en 15 días.
  • MAGIA Core — automatización empresarial y dashboards por rol.
  • MAGIA Forge — software a medida con IA.
  • Ver precios · Academia de IA

Preguntas frecuentes

Cómo importo un archivo Excel a MySQL

Tres rutas: 1) Exportar a CSV y usar LOAD DATA INFILE, 2) Usar phpMyAdmin con import directo, 3) Script Python con pandas más sqlalchemy. La tercera escala mejor para archivos de más de 100,000 filas.

Cuál es el mejor método para migrar Excel a MySQL

Para hasta 50,000 filas: phpMyAdmin o MySQL Workbench import. Para 50,000 a 1M filas: LOAD DATA INFILE desde CSV. Para más de 1M filas o múltiples hojas con relaciones: pipeline Python con chunking y validación.

Cómo evito perder datos al migrar Excel a MySQL

Limpia tipos antes de exportar (fechas, números, nulos), define el schema en MySQL antes de importar, valida fila a fila comparando conteos y sumas, y usa transacciones para poder hacer rollback si algo falla.

Qué herramientas uso para migrar grandes volúmenes

Para producción seria: Python 3.12 más pandas más sqlalchemy más PyArrow para chunking paralelo. Para validación: dbt models con tests. Para tablas mayores a 10M filas, considera ETL con PK range partitioning.

Cuánto tarda migrar Excel a MySQL

Hojas chicas (menos de 10,000 filas): minutos. Archivos medianos (100,000 a 1M filas): 1 a 4 horas. Bases legacy con múltiples hojas y limpieza fuerte: 1 a 5 días. Migraciones enterprise con validación triple: 48 horas con paralelización.

¿Esto aplica a tu operación?

Déjanos tu correo y te escribimos en menos de 24 horas con un diagnóstico inicial sin costo. Sin pitch, sin agenda comercial.

¿Prefieres conversar antes? Agenda 30 minutos con Pablo Estrada — sin pitch deck.

Agendar llamada →

¿Prefieres aprender a hacerlo tú? El curso completo de la Academia son 8 clases, gratis y sin tarjeta.

Entrar a la Academia →

Sigue leyendo

Migrar MySQL a PostgreSQL: guía empresa 2026Libros de IA para PyMEs en 2026: qué leer y qué saltarteTaller mecánico Bogotá: digitalizó órdenes de servicio Ver todo sobre datos-sistemas/migrar-base-datos →