---
title: "Migrer une base PostgreSQL vers MySQL"
description: "Migrez une base PostgreSQL vers MySQL : convertissez un fichier pg_dump en script avec les mêmes tables, clés et données, et un rapport de chaque changement."
canonical: https://intosql.com/fr/postgresql-en-mysql
last_updated: 2026-10-15
---

# Migrer une base PostgreSQL vers MySQL

Déposez un dump texte de pg_dump ou pg_dumpall, en .sql ou .sql.gz, et téléchargez un script MySQL avec les mêmes tables, clés, index et données. Chaque valeur que MySQL ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

[Guide de migration de PostgreSQL vers MySQL](https://intosql.com/docs/migrations/postgresql-to-mysql)

[Types de données de PostgreSQL vers MySQL](https://intosql.com/docs/types/postgresql-to-mysql)

## Ce qui change de PostgreSQL à MySQL

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

| Dans PostgreSQL | Dans MySQL | Ligne du rapport |
| --- | --- | --- |
| boolean | tinyint(1) |  |
| varchar(n), char(n), text | varchar(n) jusqu'à 1024 caractères, char(n) jusqu'à 255, text au-delà |  |
| numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds | varchar | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | varchar(100) avec le texte de PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | tableaux json | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, composite and extension types | longtext avec le texte de PostgreSQL | `type_replaced` |
| json, jsonb | json |  |
| timestamp | datetime(p) |  |
| timestamp with time zone | datetime(p) en UTC | `moments_as_utc` |
| time | time(p) |  |
| infinity, -infinity, BC dates and years past 9999 | NULL | `date_out_of_range` |
| NaN and Infinity in numeric, real and double precision | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| enum types | enum(...) avec les mêmes libellés |  |
| uuid, inet, cidr | uuid en char(36), inet et cidr en varchar(43) |  |
| bytea | blob, mediumblob ou longblob ; varbinary(3072) dans une clé |  |
| bit(n) | bit(n) jusqu'à 64, texte au-delà |  |
| citext and nondeterministic collations | comparaison exacte | `case_insensitive_collation` |
| serial, identity | AUTO_INCREMENT, qui reprend après l'identifiant le plus élevé |  |
| a second serial or identity column in a table | entier simple | `counter_dropped` |
| sequences not owned by a column | non créée | `sequence_not_converted` |
| generated columns | colonnes générées, STORED comme dans la source |  |
| generated columns with functions MySQL lacks | une colonne simple | `generated_not_translated` |
| defaults with functions MySQL lacks, and defaults from a sequence | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites, en ligne dans CREATE TABLE |  |
| CHECK constraints with functions MySQL lacks | non créée | `check_skipped` |
| CHECK ... NOT VALID | non créée | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes | non créé | `index_skipped` |
| foreign keys | clés étrangères, chargées avec FOREIGN_KEY_CHECKS=0 |  |
| foreign keys to tables the dump doesn't create | non créée | `foreign_key_skipped` |
| partitioned tables | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| schemas | une seule base de données, tables préfixées par le nom de leur schéma | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | listés dans le rapport | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | types déduits des valeurs | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | longtext | `unknown_type` |
| text that isn't valid in its encoding | les octets invalides deviennent le caractère de remplacement | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copié tel quel | `mojibake_suspected` |

## Charger le script dans MySQL

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

```shell
mysql --default-character-set=utf8mb4 mydb < postgresql.mysql.sql
```

Les clés étrangères sont créées comme le dump les déclare, avec FOREIGN_KEY_CHECKS=0 pendant le chargement des lignes ; une ligne qui pointe vers une ligne absente n'arrête donc pas le chargement.

Pour un gros dump, exécutez le client sur la machine du serveur, et augmentez max_allowed_packet si une seule ligne est très grande.

IntoSQL Pro charge le fichier directement dans MySQL depuis l'application de bureau ou la ligne de commande, sans écrire de script.

## Faire le dump PostgreSQL pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

- --format=plain, le format par défaut de pg_dump, écrit du SQL. Une archive custom ou directory (-Fc, -Fd) devient du SQL avec pg_restore -f dump.sql, sans serveur de base de données.
- --no-owner --no-privileges omettent les rôles et les droits, que le convertisseur ignore de toute façon ; le dump est donc plus petit.
- pg_dumpall met toutes les bases de données dans un seul fichier ; les tables de chacune sont préfixées par son nom, donc rien n'entre en collision.

## Ce qui n'est pas converti

Les vues, vues matérialisées, fonctions, procédures, déclencheurs, règles, politiques de sécurité des lignes, extensions et types sont écrits dans le langage propre à PostgreSQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour MySQL.

## Questions sur PostgreSQL vers MySQL

### Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

### Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

### Lit-il les archives pg_dump -Fc ?

Pas directement : une archive custom est un format binaire. pg_restore -f dump.sql dump.backup la transforme en SQL texte que le convertisseur lit, sans se connecter à un serveur. Le convertisseur le signale quand il reçoit une archive.

### De quelles versions de PostgreSQL le dump peut-il venir ?

Les dumps écrits par pg_dump et pg_dumpall depuis PostgreSQL 10, avec des lignes COPY ou INSERT. Chaque dump de test vient de PostgreSQL 13 et 18 et est comparé à sa source cellule par cellule.

### Les valeurs serial et identity sont-elles conservées ?

Oui, pour une colonne par table : la colonne serial ou identity en tête de la clé primaire devient AUTO_INCREMENT et reprend après l'identifiant le plus élevé. MySQL compte une colonne par table ; toute autre garde donc ses valeurs sans compteur, et le rapport le signale.

### Que deviennent les tableaux, les enums et les autres types PostgreSQL ?

Les tableaux deviennent des tableaux JSON, les booléens tinyint(1), les enums ENUM avec les mêmes libellés, et money un decimal. Les plages, types géométriques, hstore et types composites gardent le texte de PostgreSQL, et le rapport indique quelles colonnes.

### Et les fonctions, les déclencheurs et les vues ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

### Sur quelles versions de MySQL le script se charge-t-il ?

MySQL 5.7 et versions ultérieures. Chaque dump de test se charge sur 5.7 et 9, et s'arrête à la première erreur en cas de problème.

## Depuis PostgreSQL

- [PostgreSQL vers PostgreSQL](https://intosql.com/fr/postgresql-en-postgresql)
- [PostgreSQL vers MariaDB](https://intosql.com/fr/postgresql-en-mariadb)
- [PostgreSQL vers SQLite](https://intosql.com/fr/postgresql-en-sqlite)
- [PostgreSQL vers SQL Server](https://intosql.com/fr/postgresql-en-sql-server)
- [PostgreSQL vers Oracle](https://intosql.com/fr/postgresql-en-oracle)

## Vers MySQL

- [MySQL vers MySQL](https://intosql.com/fr/mysql-en-mysql)
- [MariaDB vers MySQL](https://intosql.com/fr/mariadb-en-mysql)
- [SQL Server vers MySQL](https://intosql.com/fr/sql-server-en-mysql)
- [SQLite vers MySQL](https://intosql.com/fr/sqlite-en-mysql)
- [Oracle vers MySQL](https://intosql.com/fr/oracle-en-mysql)

## Guide et toutes les paires

- [MySQL vers PostgreSQL](https://intosql.com/fr/mysql-en-postgresql)
- [Guide de migration de PostgreSQL vers MySQL](https://intosql.com/docs/migrations/postgresql-to-mysql)
- [Types de données de PostgreSQL vers MySQL](https://intosql.com/docs/types/postgresql-to-mysql)
- [Toutes les paires de bases de données](https://intosql.com/fr/migration-de-base-de-donnees)
