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.
- Limpia el Excel en origen (tipos, fechas, nulos, encabezados)
- Define el schema MySQL antes de importar (no después)
- Exporta a CSV con UTF-8 y delimitador consistente
- Importa con la herramienta adecuada al volumen
- 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.