---
title: "Migrer une base Oracle vers MySQL"
description: "Migrez une base Oracle vers MySQL : convertissez un export SQL Developer ou SQLcl en script avec les mêmes tables, clés et données, et un rapport."
canonical: https://intosql.com/fr/oracle-en-mysql
last_updated: 2026-10-15
---

# Migrer une base Oracle vers MySQL

Déposez le fichier .sql qu'écrit Database Export de SQL Developer ou SQLcl, avec ses tables et ses instructions Insert, 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 Oracle vers MySQL](https://intosql.com/docs/migrations/oracle-to-mysql)

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

## Ce qui change de Oracle à 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 Oracle | Dans MySQL | Ligne du rapport |
| --- | --- | --- |
| BOOLEAN (23ai) | tinyint(1) |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | varchar(n) jusqu'à 1024 caractères, types text au-delà |  |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), ou bigint |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | varchar(100) avec le texte d'Oracle, comme +01-06 | `type_replaced` |
| DATE, TIMESTAMP(p) | datetime(p) |  |
| TIMESTAMP(7) to TIMESTAMP(9) | six chiffres de seconde, le septième coupé | `fraction_cut` |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetime(p) en UTC | `moments_as_utc` |
| JSON (21c), and CLOB holding JSON | json |  |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) et types blob |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | text | `type_replaced` |
| collations that ignore case (BINARY_CI) | comparaison exacte (utf8mb4_bin) | `case_insensitive_collation` |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT, qui reprend après l'identifiant le plus élevé |  |
| identity columns the target can't count | un entier simple | `counter_dropped` |
| CREATE SEQUENCE | non créée | `sequence_not_converted` |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | colonnes générées, STORED si PERSISTED, VIRTUAL sinon |  |
| virtual columns with functions IntoSQL doesn't write, and the || operator | une colonne simple | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites |  |
| CHECK constraints with functions IntoSQL doesn't write | non créée | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | non créée | `check_not_enforced` |
| function-based, bitmap and domain indexes | non créée | `index_skipped` |
| foreign keys | clés étrangères, chargées avec FOREIGN_KEY_CHECKS=0 |  |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | non créée | `foreign_key_skipped` |
| partitioned tables | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| several schemas in one export | une seule base de données, tables préfixées par le nom de leur schéma | `schemas_merged` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | listés dans le rapport | `not_converted_objects` |
| exports without CREATE TABLE (data only) | types déduits des valeurs | `no_schema` |
| expressions in INSERT values other than the ones exports write | NULL | `expression_value` |
| types IntoSQL doesn't know, and object types | longtext | `unknown_type` |
| dates before year 1 and time zones given as region names | NULL | `date_out_of_range` |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULL | `invalid_value_null` |
| NUL characters in text | conservé |  |
| 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 < oracle.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 Oracle pour un meilleur résultat

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

- Dans SQL Developer, choisissez Tools, Database Export, avec DDL et le format de données Insert. SQLcl écrit la même chose avec SET SQLFORMAT INSERT.
- Exécutez ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' avant l'export : le format par défaut écrit les dates sans leur heure ni leur siècle.
- Un fichier .dmp de exp ou expdp est binaire : importez-le dans une base Oracle, par exemple Oracle Database Free dans Docker, et exportez-le avec SQL Developer.

## Ce qui n'est pas converti

Les vues, packages, procédures, fonctions, déclencheurs, types et synonymes sont écrits en PL/SQL. 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 Oracle 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.

### Puis-je convertir un fichier .dmp de exp ou expdp ?

Pas directement : Data Pump et l'Export d'origine écrivent un format binaire que seul Oracle lit. Importez-le dans n'importe quelle base Oracle, Oracle Database Free tourne dans Docker, et exportez-le avec Database Export de SQL Developer ou SQLcl. Le convertisseur le signale quand il reçoit un fichier .dmp.

### De quelles versions de Oracle l'export peut-il venir ?

Les exports de SQL Developer et SQLcl, avec les définitions de tables de DBMS_METADATA, depuis Oracle 11g. Chaque export de test vient de Oracle 21c et 23ai, dans des sessions américaine, allemande et ISO, et est comparé à sa source cellule par cellule.

### Que deviennent NUMBER, DATE et les autres types Oracle ?

NUMBER devient decimal, ou bigint pour les nombres entiers, et du texte au-delà de 65 chiffres ; DATE devient datetime et garde son heure ; CLOB longtext, BLOB blob, et les intervalles gardent leur texte Oracle. NaN et Infinity deviennent NULL et le rapport les compte.

### Les colonnes d'identité et les séquences sont-elles gardées ?

Les colonnes d'identité deviennent AUTO_INCREMENT et reprennent après l'identifiant le plus élevé. MySQL n'a pas de séquences ; elles sont donc signalées, tout comme les valeurs par défaut qui y puisent.

### Et les packages, procédures et déclencheurs PL/SQL ?

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 export de test se charge sur 5.7 et 9, et s'arrête à la première erreur en cas de problème.

## Depuis Oracle

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

## Vers MySQL

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

## Guide et toutes les paires

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