Inicio › Herramientas para desarrolladores › Conversor de MySQL a PostgreSQL

Conversor de MySQL a PostgreSQL

Pega un mysqldump, una exportación de phpMyAdmin o solo sentencias CREATE TABLE y obtén SQL listo para PostgreSQL. Se convierten las comillas invertidas, AUTO_INCREMENT, los tipos exclusivos de MySQL, los ENUM, las cláusulas de motor y juego de caracteres, las fechas cero y los escapes de cadenas, y todo lo que requiere una decisión humana aparece en las notas de revisión.

Última actualización:

Opciones de conversión
Publicidad
Publicidad

Cómo usar Conversor de MySQL a PostgreSQL

  1. Pega tu SQL de MySQL o abre un archivo .sql. Se carga un volcado de ejemplo para que veas primero el resultado.
  2. Elige las opciones que encajen con tu diseño de destino: identity o serial, cómo guardar los ENUM, marcas de tiempo con o sin zona horaria.
  3. Lee las notas de revisión bajo los botones; enumeran funciones, rutinas y valores que requieren una decisión.
  4. Descarga el archivo .sql o cópialo y después ejecútalo con psql, por ejemplo psql -d mydb -f sample-postgres.sql.
  5. Prueba primero en una copia y compara el número de filas entre las dos bases de datos.

Correspondencia de tipos de MySQL a PostgreSQL

MySQLPostgreSQLNotas
TINYINT(1), BIT(1), BOOLBOOLEANLos valores 0/1 pasan a ser false/true. Los demás anchos de TINYINT pasan a ser SMALLINT.
TINYINT, SMALLINTSMALLINTSMALLINT UNSIGNED pasa a ser INTEGER para que sigan cabiendo valores de hasta 65,535.
MEDIUMINT, INTINTEGERINT UNSIGNED pasa a ser BIGINT (PostgreSQL no tiene tipos sin signo).
BIGINTBIGINTBIGINT UNSIGNED por encima de 263−1 necesita NUMERIC(20).
INT AUTO_INCREMENTINTEGER GENERATED BY DEFAULT AS IDENTITYO SERIAL / BIGSERIAL.
FLOAT / DOUBLEREAL / DOUBLE PRECISIONUsa NUMERIC para dinero y valores exactos.
DECIMAL(p,s)NUMERIC(p,s)Un DECIMAL sin parámetros equivale a DECIMAL(10,0) en MySQL.
VARCHAR(n), CHAR(n)igualSe eliminan las cláusulas de juego de caracteres y de intercalación.
TINYTEXT … LONGTEXTTEXTTEXT de PostgreSQL no tiene variantes small/medium/long.
BLOB, VARBINARY, BINARYBYTEALos literales hexadecimales (0x… o X'…') pasan a ser '\x…'.
DATETIME(n)TIMESTAMP(n)O TIMESTAMPTZ si guardas instantes de tiempo en distintas zonas horarias.
TIMESTAMPTIMESTAMP / TIMESTAMPTZTIMESTAMP de MySQL se guarda en UTC, lo que corresponde a TIMESTAMPTZ.
YEARSMALLINTAñade un CHECK si necesitas el rango 1901-2155.
JSONJSONBJSONB se indexa y compara más rápido; JSON conserva el orden de las claves y los espacios.
ENUM('a','b')CREATE TYPE … AS ENUMO VARCHAR + CHECK, o TEXT.
SET('a','b')VARCHARPlantéate TEXT[] o una tabla de unión.
GEOMETRY, POINT…PostGIS geometryRequiere la extensión PostGIS.

Sintaxis que cambia

MySQLPostgreSQL
`order`"order" (las palabras reservadas mantienen las comillas)
'O\'Neil', 'a\nb''O''Neil', E'a\nb'
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4se elimina (se aplica la codificación de la base de datos)
KEY idx (col) dentro de CREATE TABLECREATE INDEX idx ON table (col);
INSERT IGNOREINSERT … ON CONFLICT DO NOTHING
ON DUPLICATE KEY UPDATE a = VALUES(a)ON CONFLICT (id) DO UPDATE SET a = EXCLUDED.a
IFNULL(a, b), IF(c, x, y)COALESCE(a, b), CASE WHEN c THEN x ELSE y END
GROUP_CONCAT(x SEPARATOR ';')STRING_AGG((x)::text, ';')
LIMIT 10, 20LIMIT 20 OFFSET 10
CURDATE(), UNIX_TIMESTAMP()CURRENT_DATE, EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)::bigint
col REGEXP 'x'col ~* 'x' (las expresiones regulares de MySQL no distinguen mayúsculas por defecto)

Lista de comprobación para una migración segura

  1. Vuelca el esquema y los datos: mysqldump --single-transaction --skip-triggers --hex-blob dbname > dump.sql. --hex-blob mantiene exactos los datos binarios.
  2. Convierte aquí el volcado y lee todas las notas de revisión.
  3. Crea una base de datos vacía con codificación UTF-8 y ejecuta el script con psql -v ON_ERROR_STOP=1 -d newdb -f dump-postgres.sql para que se detenga en el primer error.
  4. Compara el número de filas por tabla y después revisa al azar fechas, booleanos, decimales y textos con acentos o emojis.
  5. Actualiza las consultas de la aplicación: funciones específicas de MySQL, LIMIT x, y, comparación de cadenas sin distinguir mayúsculas (el = de PostgreSQL distingue mayúsculas; usa ILIKE o citext) y comillas invertidas en el código.

Para traducir consultas sueltas entre muchos dialectos SQL, usa el Conversor de dialectos SQL. Para ordenar el resultado, pásalo por el Formateador SQL.

Preguntas frecuentes

¿Cómo convierto un volcado de MySQL a PostgreSQL?

Exporta con mysqldump (o la exportación SQL de phpMyAdmin), abre aquí el archivo y descarga el script convertido. Crea una base de datos vacía en PostgreSQL y ejecuta el script con psql -d dbname -f file.sql. El conversor elimina las sentencias exclusivas de MySQL, reescribe los tipos y la sintaxis, añade las claves foráneas después de los datos y restablece las secuencias al final.

¿En qué se convierte AUTO_INCREMENT en PostgreSQL?

Por defecto, en una columna identity: id INTEGER GENERATED BY DEFAULT AS IDENTITY, el enfoque estándar de SQL recomendado desde PostgreSQL 10. También puedes elegir SERIAL o BIGSERIAL. Ambos se basan en una secuencia, y el script avanza la secuencia más allá del id más alto insertado para que las filas nuevas no colisionen.

¿Por qué se sustituyen las comillas invertidas?

MySQL pone los identificadores entre comillas invertidas, mientras que PostgreSQL usa comillas dobles y convierte a minúsculas los nombres sin comillas. Por defecto, los nombres se pasan a minúsculas y se dejan sin comillas salvo que sean palabras reservadas o contengan caracteres inusuales, para que puedas escribir consultas sin comillas. Elige Mantener mayúsculas/minúsculas si tu aplicación depende de nombres con mayúsculas y minúsculas.

¿Cómo se convierten las columnas ENUM de MySQL?

PostgreSQL tiene tipos enum reales, así que cada columna ENUM pasa a ser un CREATE TYPE tabla_columna AS ENUM (…) seguido de una columna de ese tipo. También puedes guardar el valor en un VARCHAR con una restricción CHECK que enumere los valores permitidos, más fácil de cambiar después, o como TEXT simple.

¿Qué pasa con TINYINT(1) y las fechas cero?

TINYINT(1) y BIT(1) son la forma habitual de MySQL de guardar booleanos, así que pasan a ser BOOLEAN y los valores 0/1 insertados pasan a ser false/true. PostgreSQL rechaza fechas como '0000-00-00', así que las fechas cero en los INSERT pasan a ser NULL y se eliminan los valores predeterminados de fecha cero; las columnas NOT NULL que contenían fechas cero necesitan un valor predeterminado real.

¿Convierte procedimientos almacenados y triggers?

No. Las rutinas y triggers de MySQL usan un lenguaje procedimental distinto, así que los bloques entre líneas DELIMITER y las sentencias CREATE PROCEDURE/FUNCTION/TRIGGER se conservan como comentarios para que los reescribas en PL/pgSQL. El único trigger que se genera automáticamente es el que sustituye a ON UPDATE CURRENT_TIMESTAMP.

¿Se sube mi volcado de base de datos?

No. La conversión es JavaScript simple que se ejecuta en la pestaña de tu navegador, así que las definiciones de tablas y los datos nunca salen de tu ordenador. Los volcados muy grandes (cientos de megabytes) se gestionan mejor con una herramienta de migración específica como pgloader.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Conversores de datos y formatos de archivo →