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

# Migrer une base MariaDB vers PostgreSQL

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

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

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

## Ce qui change de MariaDB à PostgreSQL

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 MariaDB | Dans PostgreSQL | Ligne du rapport |
| --- | --- | --- |
| TINYINT(1), BOOL | boolean si chaque valeur vaut 0 ou 1, sinon smallint | `bool_kept_numeric` |
| UNSIGNED integers | l'entier immédiatement plus large, avec un CHECK qui interdit les négatifs ; BIGINT UNSIGNED devient bigint si chaque valeur y tient, sinon numeric(20,0) | `unsigned_widened` |
| ZEROFILL and display widths | supprimé | `zerofill_dropped` |
| FLOAT(M,D) | real ou double precision, sans l'échelle | `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 retiré | `not_null_relaxed` |
| DEFAULT '0000-00-00' | aucune valeur par défaut | `zero_date_default` |
| TIME | time si chaque valeur tient dans une journée, sinon interval | `time_as_interval` |
| YEAR | smallint avec un CHECK de sa plage |  |
| CHAR(n) | varchar(n) |  |
| DATETIME | timestamp |  |
| TIMESTAMP | timestamptz dans le fuseau horaire indiqué par le dump, UTC s'il n'en indique aucun | `timestamp_zone_assumed` |
| ENUM | text avec un CHECK de ses valeurs |  |
| ENUM holding '' (MySQL's error value) | la valeur vide autorisée par le CHECK | `enum_invalid_value` |
| ENUM or SET holding values outside its list | pas de CHECK | `enum_check_skipped` |
| SET | text[] avec un CHECK qui vérifie que chaque élément est dans la liste |  |
| JSON | jsonb ; json quand une valeur contient \u0000 | `json_not_jsonb` |
| NUL bytes in text | retiré | `nul_removed` |
| text that isn't valid in its character set | les octets invalides deviennent le caractère de remplacement | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copié tel quel | `mojibake_suspected` |
| AUTO_INCREMENT | GENERATED BY DEFAULT AS IDENTITY, avec le compteur placé après les identifiants copiés |  |
| MyISAM AUTO_INCREMENT on the second column of a key | un seul compteur pour la table | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | un déclencheur BEFORE UPDATE | `on_update_trigger` |
| generated columns | STORED | `virtual_as_stored` |
| generated columns with functions PostgreSQL lacks | une colonne simple | `generated_not_translated` |
| INVISIBLE columns | colonnes ordinaires | `invisible_column` |
| CHECK constraints | traduites, en ligne dans CREATE TABLE |  |
| CHECK constraints with functions PostgreSQL lacks | non créée | `check_skipped` |
| CHECK ... NOT ENFORCED | non créée | `check_not_enforced` |
| defaults with functions PostgreSQL lacks | aucune valeur par défaut | `default_not_translated` |
| keys and indexes on a prefix, c(20) | un index sur left(c, 20) | `prefix_unique` |
| FULLTEXT indexes | GIN sur to_tsvector('simple', ...) | `fulltext_as_gin` |
| indexes on values over 2,000 bytes | hash | `index_on_wide_values` |
| SPATIAL indexes | non créé sans PostGIS | `spatial_index_skipped` |
| functional indexes PostgreSQL can't write | non créé | `index_skipped` |
| foreign keys | après les données, NOT VALID, puis validée avec un avertissement sur les orphelins |  |
| foreign keys to columns without a unique key | non créée | `foreign_key_skipped` |
| table and column names | en minuscules si le nom reste unique | `identifier_renamed` |
| names over 63 bytes | raccourci avec un hachage | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | WKB dans bytea | `geometry_as_wkb` |
| INET4, INET6, UUID (MariaDB) | inet, uuid |  |
| BINARY, VARBINARY, BLOB | bytea |  |
| PARTITION BY | une seule table | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | une table avec les lignes actuelles | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | une table ordinaire | `engine_dropped` |
| views, triggers, procedures, functions and events | listés dans le rapport | `not_converted_objects` |
| dumps without CREATE TABLE | types déduits des valeurs | `no_schema` |
| geometries in a dump without CREATE TABLE | WKB dans bytea | `geometry_inferred` |
| _ci collations | comparaison exacte | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | converti, avec un avertissement | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | lu comme Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | lu comme UTF-8, avec un avertissement | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | évaluées |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | la valeur par défaut de la colonne | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | lignes simples | `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 avec sa valeur actuelle |  |
| VECTOR(n) (MariaDB 11.7+) | jsonb avec les flottants en tableau | `type_replaced` |

## Charger le script dans PostgreSQL

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
psql -v ON_ERROR_STOP=1 -d mydb -f mariadb.postgresql.sql
```

Les clés étrangères sont ajoutées en NOT VALID, puis validées. Si une ligne pointe vers une ligne qui n'existe pas, le script vous indique quelle contrainte, au lieu d'échouer à mi-chemin.

Pour un gros dump, créez d'abord la base de données et exécutez le script avec psql depuis la machine du serveur.

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

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

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

- --default-character-set=utf8mb4 garde les emoji et autres caractères sur 4 octets, qu'un dump utf8mb3 perd avant que le convertisseur ne le voie.
- --hex-blob écrit les colonnes binaires et les valeurs VECTOR en hexadécimal, ce qui résiste aux copies entre systèmes.
- --routines --triggers --events ajoutent ces objets au dump, pour que le rapport puisse les lister.

## Ce qui n'est pas converti

Les vues, déclencheurs, procédures stockées, fonctions et événements sont écrits dans le langage propre à MariaDB. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour PostgreSQL.

## Questions sur MariaDB vers PostgreSQL

### 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.

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

Les dumps de mariadb-dump et mysqldump sur MariaDB 10.3 à 12, avec un INSERT par table ou un par ligne. Chaque dump de test vient de MariaDB 10.11, 11.4 et 11.8 et est comparé à sa source cellule par cellule.

### Les colonnes UUID, INET6, JSON et VECTOR sont-elles conservées ?

UUID devient uuid, INET4 et INET6 inet, JSON jsonb, et VECTOR un tableau jsonb de ses flottants. Les dates zéro deviennent NULL et le rapport les compte.

### Les valeurs AUTO_INCREMENT et les séquences sont-elles conservées ?

Oui. Chaque colonne AUTO_INCREMENT devient une colonne d'identité qui reprend après l'identifiant le plus élevé. Les séquences deviennent des séquences PostgreSQL, et les valeurs par défaut qui puisent dans une séquence continuent d'y puiser.

### Et les procédures stockées et les déclencheurs ?

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 PostgreSQL le script se charge-t-il ?

PostgreSQL 13 à 18. Le même script se charge sur chacune, et s'arrête à la première erreur en cas de problème.

## Depuis MariaDB

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

## Vers PostgreSQL

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

## Guide et toutes les paires

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