Convertidor de CSV a SQL

Genera CREATE TABLE y sentencias INSERT desde cualquier CSV, sin subir nada.

Tu CSV se procesa en esta pestaña — no se sube

Genera sentencias INSERT y CREATE TABLE a partir de un archivo CSV

Ejemplo cargado: edítalo o límpialo

Convierte las filas de tu CSV en un script SQL listo para ejecutar

Pega o suelta un archivo CSV y la herramienta lee la fila de encabezados, deduce un tipo de dato razonable para cada columna y genera un CREATE TABLE junto con sentencias INSERT en lotes que puedes ejecutar en MySQL, PostgreSQL, SQLite, SQL Server o SQL estándar (ANSI). Cada identificador se entrecomilla como espera el motor —acentos graves (backticks) en MySQL, comillas dobles en PostgreSQL, corchetes en SQL Server— para que palabras reservadas como order o select no rompan el script.

La inferencia de tipos es determinista, no la adivina un modelo de IA: un código postal con cero inicial como 00501 se queda como TEXT para no perder el cero, un valor que supera el límite de 32 bits con signo (2 147 483 647) pasa a BIGINT, y solo las columnas con true/false o yes/no reales se convierten en BOOLEAN. Cada cadena de texto se escapa duplicando las comillas simples, así que una celda maliciosa como Robert'); DROP TABLE students;-- se emite como un único literal inofensivo. No se sube nada: todo el análisis y la generación ocurren en la pestaña de tu navegador.

El mismo CSV genera un SQL distinto en cada motor, porque los nombres de tipo y los literales cambian de verdad. Un entero es INT en MySQL y SQL Server, pero INTEGER en PostgreSQL, SQLite y ANSI; una columna decimal de punto fijo se convierte en DECIMAL o NUMERIC, y una en notación científica pasa a DOUBLE, DOUBLE PRECISION, FLOAT o REAL según el destino; los booleanos se escriben TRUE/FALSE en MySQL y PostgreSQL, pero 1/0 en SQLite y en el tipo BIT de SQL Server; y las marcas de tiempo salen como DATETIME, TIMESTAMP o DATETIME2. La salida de SQL Server además antepone una N a los literales de texto para conservar Unicode, y como T-SQL limita a 1000 filas cada cláusula VALUES de varias filas, el tamaño de lote se ajusta ahí automáticamente: elige primero el dialecto y lo demás se acomoda solo.

Los números se dimensionan a partir de los datos que pegas. Una columna con 19.99 y 1234.5 se convierte en DECIMAL(6,2) —con espacio para la parte entera más larga y la parte decimal más profunda a la vez— en lugar de un flotante con pérdidas, que es justo lo que quieres para importes de dinero. Las columnas de texto también se miden: los campos cortos pasan a VARCHAR(n) del tamaño del valor más largo, y lo que supera 255 caracteres cae a TEXT (NVARCHAR(MAX) en SQL Server). Las celdas vacías se vuelven NULL por defecto para que las filas incompletas carguen igual, y una columna solo se marca NOT NULL cuando todas las filas tienen valor.

Esto es un generador de sentencias, no un motor de migración, y se mantiene deliberadamente literal con tus datos. No inventa claves primarias, índices ni claves foráneas —no puede conocer tu esquema— y no genera UPDATE, UPSERT ni MERGE. Las fechas se reconocen solo en formato ISO 8601 sin ambigüedad (2026-03-14); cualquier cosa con barras o año de dos dígitos se conserva como texto a propósito. Revisa el CREATE TABLE antes de ejecutarlo en una base de datos real, añade las claves y restricciones que tu modelo necesite, y para tablas de más de unos cientos de miles de filas usa el cargador masivo nativo que se muestra abajo en vez de un único script INSERT gigante.

Cómo cargar el script en PostgreSQL, MySQL y SQLite

Genera el script, guárdalo como datos.sql y pásalo al cliente de línea de comandos de tu base de datos. Las filas del INSERT salen agrupadas en lotes (100 por sentencia de forma predeterminada, ajustable), así que el archivo se procesa rápido incluso en tablas grandes.

# PostgreSQL
psql -d mibd -f datos.sql

# MySQL / MariaDB
mysql -u root -p mibd < datos.sql

# SQLite
sqlite3 mibd.db < datos.sql

# SQL Server
sqlcmd -S localhost -d mibd -i datos.sql
Carga el archivo .sql desde la terminal, una línea por motor.

Envolver toda la carga en una sola transacción es la mayor mejora de velocidad: si no, cada INSERT confirmado obliga a su propia escritura en disco. Desactiva el autocommit —o encierra el script entre BEGIN y COMMIT— para que miles de filas se confirmen una vez en lugar de miles de veces.

BEGIN;
-- aquí van las sentencias INSERT generadas
COMMIT;
Encierra las sentencias INSERT generadas para confirmarlas como una sola transacción.

Para archivos con cientos de miles de filas, prescinde de las sentencias INSERT y usa el cargador masivo nativo del motor contra el CSV en crudo: es mucho más rápido y lee en flujo en vez de construir un script enorme. Usa esta herramienta para el CREATE TABLE y luego carga los datos con los comandos de abajo.

-- PostgreSQL (meta-comando de psql, lee el archivo en el cliente)
\copy lugares FROM 'lugares.csv' WITH (FORMAT csv, HEADER true)

-- MySQL
LOAD DATA LOCAL INFILE 'lugares.csv' INTO TABLE lugares
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\n' IGNORE 1 LINES;

-- SQLite (dentro del shell sqlite3)
.mode csv
.import --skip 1 lugares.csv lugares
Los cargadores nativos leen el CSV directamente; fíjate en IGNORE 1 / HEADER / --skip 1 para descartar la fila de encabezados.

Por qué una columna sale como TEXT cuando esperabas un número

La inferencia es de todo o nada por columna: la herramienta elige el tipo más específico que cumplen todas las celdas no vacías. Un solo valor que falle la prueba numérica o de fecha baja toda la columna a TEXT, y eso es intencional: nunca deforma tus datos en silencio. Las celdas vacías cuentan como NULL, no como un fallo.

Valor en la columnaTipo inferidoPor qué
00501TEXT / VARCHARUn cero inicial se pierde como entero, así que códigos postales, SKU y prefijos telefónicos se quedan como texto y entre comillas.
1,000TEXTEl separador de miles con coma no pasa la prueba numérica; el punto es el separador decimal. Quítalo si quieres INTEGER.
5000000000BIGINTSupera el límite de 32 bits con signo (2.147.483.647), así que INT pasa a BIGINT.
solo 0 y 1INTEGERUn 0/1 a secas es ambiguo; solo las columnas true/false o yes/no se vuelven BOOLEAN.
01/02/2020TEXTOrden día/mes ambiguo. Solo se reconoce como DATE el formato ISO 8601 (2020-01-02).
19.99DECIMAL / NUMERICPunto fijo (el punto es el separador decimal): la precisión y la escala se miden a partir de los valores reales.

Si una columna no toma el tipo que esperabas, límpiala en el CSV de origen (quita símbolos de moneda, separadores de miles o texto suelto) y vuelve a generar; no hace falta editar el SQL a mano. Los encabezados con palabras reservadas como order o select son seguros tal cual, porque cada identificador siempre se entrecomilla según el dialecto elegido.

Preguntas frecuentes

¿Sube mi CSV a algún servidor?

No. Todo el análisis y la generación del SQL ocurren en tu navegador; el archivo nunca sale de tu equipo y no hay servidores, cuentas ni llamadas a terceros. Una vez cargada la página, puedes trabajar incluso sin conexión.

¿Qué motores de base de datos admite?

Genera SQL para MySQL, PostgreSQL, SQLite, SQL Server (T-SQL) y ANSI estándar. El dialecto elegido controla el entrecomillado de identificadores, los nombres de los tipos de datos en el CREATE TABLE y cómo se representan los booleanos (TRUE/FALSE frente a 1/0).

¿Por qué mi columna de códigos postales sale como TEXT y no como número?

Porque un cero inicial como 00501 se perdería al guardarlo como entero. La herramienta detecta el cero inicial, los separadores de miles y las fechas ambiguas, y deja esas columnas como TEXT entre comillas para conservar el valor exacto al cargarlo en la base de datos.

Herramientas relacionadas