MySQL To PostgreSQL
MySQL is the richest source pgferry handles — enums, sets, unsigned types, generated columns, optional PostGIS, and collation handling all live here. If your source is actually MariaDB, hop over to the dedicated MariaDB guide instead of assuming every MySQL-specific feature carries over unchanged.
Start here
Section titled “Start here”- minimal-safe example — the gentle first rehearsal
- chunked-resume example — for when starting over would really hurt
- hooks example — if
planflags manual follow-up work
MySQL-specific options to decide deliberately
Section titled “MySQL-specific options to decide deliberately”enum_modeset_modetinyint1_as_booleanbinary16_as_uuidstring_uuid_as_uuidwiden_unsigned_integersadd_unsigned_checksci_as_citext[postgis]
Common caveats
Section titled “Common caveats”- generated columns are copied as values, not recreated as expressions
- unsupported indexes such as
FULLTEXT, prefix indexes, and expression indexes are reported and skipped single_txis available when you need one consistent snapshot on a live source- zero dates need explicit handling through
zero_date_mode
Migrating to a managed Postgres provider?
Section titled “Migrating to a managed Postgres provider?”Once the MySQL side is sorted, these destination playbooks layer on the provider connection, TLS, pooling, and firewall setup:
- MySQL to Supabase
- MySQL to Neon
- MySQL to Railway Postgres
- MySQL to Render Postgres
- MySQL to PlanetScale Postgres
Migrating from a managed MySQL source?
Section titled “Migrating from a managed MySQL source?”PlanetScale, RDS, and Cloud SQL are all MySQL under the hood — the type behavior above applies unchanged — but each brings its own access, TLS, and firewall quirks. These guides cover the source-side specifics:
- PlanetScale to Supabase · PlanetScale to Neon — PlanetScale’s MySQL/Vitess product as a source
- AWS RDS MySQL to Supabase · AWS RDS MySQL to Neon — RDS and Aurora MySQL
- Cloud SQL for MySQL to Supabase · Cloud SQL for MySQL to Neon — Google Cloud SQL