---
title: "Migrar Excel a MySQL: guía operativa sin pérdida"
description: "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."
slug: "como-migrar-una-base-de-datos-de-excel-a-mysql"
url: "https://catalizadora.ai/blog/como-migrar-una-base-de-datos-de-excel-a-mysql"
cluster: "datos-sistemas/migrar-base-datos"
author: "Pablo Estrada"
published_at: "2026-05-11T12:00:00+00:00"
updated_at: "2026-06-19T19:59:51.42746+00:00"
read_minutes: "5"
lang: "es"
---
# 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.

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:

```sql
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)

```sql
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)

```python
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:

```sql
-- 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](https://catalizadora.ai/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](https://catalizadora.ai/magia/solo) entrega base de datos lista en 15 días por 4,500 USD.
## 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.


---

Source: https://catalizadora.ai/blog/como-migrar-una-base-de-datos-de-excel-a-mysql
Author: Pablo Estrada — AI Catalyst, LLC (catalizadora.ai)
