---
title: "MySQL omzetten naar PostgreSQL"
description: "Zet een MySQL- of MariaDB-dump om naar een PostgreSQL-script dat in één keer laadt, met een rapport van elke wijziging. In je browser: de dump wordt nooit geüpload."
canonical: https://intosql.com/nl/mysql-naar-postgresql
last_updated: 2026-10-15
---

# MySQL omzetten naar PostgreSQL

Zet een dump van mysqldump, mariadb-dump, mysqlpump, phpMyAdmin of Adminer neer, als .sql of .sql.gz, en download een PostgreSQL-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die PostgreSQL niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

## Wat er verandert van MySQL naar PostgreSQL

Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.

| In MySQL | In PostgreSQL | Rapportregel |
| --- | --- | --- |
| TINYINT(1), BOOL | boolean als elke waarde 0 of 1 is, anders smallint | `bool_kept_numeric` |
| UNSIGNED integers | het eerstvolgende bredere gehele getal met een CHECK dat het niet negatief is; BIGINT UNSIGNED wordt bigint als elke waarde past, anders numeric(20,0) | `unsigned_widened` |
| ZEROFILL and display widths | weggelaten | `zerofill_dropped` |
| FLOAT(M,D) | real of double precision, zonder de schaal | `float_scale_dropped` |
| BIT(1), BIT(n) | boolean, bit(n) |  |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULL | `invalid_date_null` |
| NOT NULL columns with values that become NULL | NOT NULL weggelaten | `not_null_relaxed` |
| DEFAULT '0000-00-00' | geen standaardwaarde | `zero_date_default` |
| TIME | time als elke waarde binnen een dag valt, anders interval | `time_as_interval` |
| YEAR | smallint met een CHECK op het bereik |  |
| CHAR(n) | varchar(n) |  |
| DATETIME | timestamp |  |
| TIMESTAMP | timestamptz in de tijdzone die de dump vermeldt, UTC als die er geen vermeldt | `timestamp_zone_assumed` |
| ENUM | text met een CHECK op de waarden |  |
| ENUM holding '' (MySQL's error value) | de lege waarde, toegestaan door de check | `enum_invalid_value` |
| ENUM or SET holding values outside its list | geen CHECK | `enum_check_skipped` |
| SET | text[] met een CHECK dat elk element in de lijst staat |  |
| JSON | jsonb; json als een waarde \u0000 bevat | `json_not_jsonb` |
| NUL bytes in text | verwijderd | `nul_removed` |
| text that isn't valid in its character set | de foute bytes als het vervangingsteken | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | ongewijzigd gekopieerd | `mojibake_suspected` |
| AUTO_INCREMENT | GENERATED BY DEFAULT AS IDENTITY, met de teller voorbij de gekopieerde id's |  |
| MyISAM AUTO_INCREMENT on the second column of a key | één teller voor de tabel | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | een BEFORE UPDATE-trigger | `on_update_trigger` |
| generated columns | STORED | `virtual_as_stored` |
| generated columns with functions PostgreSQL lacks | een gewone kolom | `generated_not_translated` |
| INVISIBLE columns | gewone kolommen | `invisible_column` |
| CHECK constraints | vertaald, inline in CREATE TABLE |  |
| CHECK constraints with functions PostgreSQL lacks | niet aangemaakt | `check_skipped` |
| CHECK ... NOT ENFORCED | niet aangemaakt | `check_not_enforced` |
| defaults with functions PostgreSQL lacks | geen standaardwaarde | `default_not_translated` |
| keys and indexes on a prefix, c(20) | een index op left(c, 20) | `prefix_unique` |
| FULLTEXT indexes | GIN op to_tsvector('simple', ...) | `fulltext_as_gin` |
| indexes on values over 2,000 bytes | hash | `index_on_wide_values` |
| SPATIAL indexes | niet aangemaakt zonder PostGIS | `spatial_index_skipped` |
| functional indexes PostgreSQL can't write | niet aangemaakt | `index_skipped` |
| foreign keys | na de data, NOT VALID, daarna gevalideerd met een waarschuwing bij wezen |  |
| foreign keys to columns without a unique key | niet aangemaakt | `foreign_key_skipped` |
| table and column names | kleine letters als dat uniek blijft | `identifier_renamed` |
| names over 63 bytes | ingekort met een hash | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | WKB in bytea | `geometry_as_wkb` |
| INET4, INET6, UUID (MariaDB) | inet, uuid |  |
| BINARY, VARBINARY, BLOB | bytea |  |
| PARTITION BY | één tabel | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | een tabel met de huidige rijen | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | een gewone tabel | `engine_dropped` |
| views, triggers, procedures, functions and events | vermeld in het rapport | `not_converted_objects` |
| dumps without CREATE TABLE | typen afgeleid uit de waarden | `no_schema` |
| geometries in a dump without CREATE TABLE | WKB in bytea | `geometry_inferred` |
| _ci collations | exacte vergelijking | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | geconverteerd, met een waarschuwing | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | gelezen als Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | gelezen als UTF-8, met een waarschuwing | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | geëvalueerd |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | de standaardwaarde van de kolom | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | gewone rijen | `replace_as_insert` |
| types IntoSQL doesn't know | text | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE met de huidige waarde |  |

## Het script in PostgreSQL laden

Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.

```shell
psql -v ON_ERROR_STOP=1 -d mydb -f mysql.postgresql.sql
```

Refererende sleutels worden toegevoegd als NOT VALID en daarna gevalideerd. Verwijst een rij naar een rij die niet bestaat, dan vertelt het script je welke constraint het is, in plaats van halverwege te mislukken.

Maak voor een grote dump eerst de database aan en voer het script uit met psql vanaf dezelfde machine als de server.

## Een dump van MySQL maken voor het beste resultaat

De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:

- --default-character-set=utf8mb4 behoudt emoji en andere 4-bytestekens, die een utf8-dump kwijtraakt voordat de converter hem ziet.
- --hex-blob schrijft binaire kolommen als hexadecimaal, wat kopiëren tussen systemen overleeft.
- --routines --triggers --events voegen die objecten aan de dump toe, zodat het rapport ze kan vermelden.

## Wat niet wordt geconverteerd

Weergaven, triggers, opgeslagen procedures, functies en gebeurtenissen worden geschreven in de eigen taal van elke database. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor PostgreSQL.

## Gemeten tegen pgloader

Dezelfde dumps, geconverteerd en geladen door IntoSQL en door pgloader 3.6.7 op één machine (een i9-10900K met 10 cores en een SATA SSD), in oktober 2026.

- Een TINYINT(1)-kolom met 2, -1 en -5: pgloader laadt voor elk ervan true, zonder waarschuwing. IntoSQL behoudt de getallen en het rapport legt uit waarom.
- Een dump met een standaardwaarde 'it's', een tabel met een backtick in de naam, een ENUM met de lege waarde en een TIME van meer dan 24 uur: pgloader stopt. IntoSQL converteert en laadt hem.
- Wat pgloader laadt, is zijn primaire, unieke en refererende sleutels en zijn identities kwijt. IntoSQL behoudt ze allemaal.
- Een dump van 5.3 GB met 30 miljoen rijen: pgloader moet hem eerst terugzetten in een draaiende MySQL, wat 18 minuten duurt, en heeft daarna met de standaardinstellingen te weinig geheugen. IntoSQL converteert de dump in 10 seconden, en psql laadt het script in ongeveer 3 minuten.
- Over 476 dumps van MySQL 5.5 tot en met 9 en MariaDB 10.3 tot en met 12, geladen in PostgreSQL 13 en 18: geen laadfouten, en geen waarde veranderd zonder een regel in het rapport.

## Vragen over MySQL naar PostgreSQL

### Wordt mijn dump geüpload?

Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.

### Hoe groot mag de dump zijn?

De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.

### Leest het MariaDB-dumps?

Ja. Dumps van mariadb-dump en van MariaDB 10.3 tot en met 12 worden op dezelfde manier geconverteerd, inclusief de INET6-, INET4- en UUID-kolommen van MariaDB.

### Wat gebeurt er met datums als 0000-00-00?

PostgreSQL kent geen nuldatum, dus ze worden NULL en de kolom accepteert NULL. Het rapport vermeldt hoeveel er in elke kolom waren.

### Blijven AUTO_INCREMENT-waarden behouden?

Ja. Elke AUTO_INCREMENT-kolom wordt een identity-kolom, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste, of na de AUTO_INCREMENT van de tabel als die hoger is.

### Wordt TINYINT(1) boolean?

Alleen als elke waarde in de kolom 0 of 1 is. Bevat hij andere getallen, zoals 2 of -1, dan blijft het een getal en legt het rapport uit waarom, zodat geen waarde per ongeluk true wordt.

### En opgeslagen procedures en triggers?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft. ON UPDATE CURRENT_TIMESTAMP is de uitzondering: dat wordt een PostgreSQL-trigger.

### Op welke PostgreSQL-versies laadt het script?

PostgreSQL 13 tot en met 18. Hetzelfde script laadt op elk ervan en stopt bij de eerste fout als er iets misgaat.

## Andere conversies naar PostgreSQL

- [Excel omzetten naar PostgreSQL](https://intosql.com/nl/excel-naar-postgresql)
- [CSV omzetten naar PostgreSQL](https://intosql.com/nl/csv-naar-postgresql)
- [JSON omzetten naar PostgreSQL](https://intosql.com/nl/json-naar-postgresql)
