---
title: "MySQL zu Oracle migrieren, im Browser"
description: "Migriere eine MySQL- oder MariaDB-Datenbank zu Oracle: Ihr Dump wird ein Skript mit denselben Tabellen, Schlüsseln und Daten, plus Bericht über jede Änderung."
canonical: https://intosql.com/de/mysql-in-oracle
last_updated: 2026-10-15
---

# MySQL zu Oracle migrieren, im Browser

Leg einen Dump aus mysqldump, mariadb-dump, mysqlpump, phpMyAdmin oder Adminer ab, als .sql oder .sql.gz, und lade ein Oracle-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den Oracle nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

[Leitfaden: MySQL zu Oracle migrieren](https://intosql.com/docs/migrations/mysql-to-oracle)

[Datentypen von MySQL zu Oracle](https://intosql.com/docs/types/mysql-to-oracle)

## Was sich von MySQL zu Oracle ändert

Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.

| In MySQL | In Oracle | Berichtszeile |
| --- | --- | --- |
| TINYINT(1), BOOL | NUMBER(1) mit einem CHECK auf 0 und 1, wenn jeder Wert 0 oder 1 ist, sonst NUMBER(3) | `bool_kept_numeric` |
| UNSIGNED integers | NUMBER, breit genug für den Bereich, mit einem CHECK gegen negative Werte |  |
| ZEROFILL and display widths | entfernt | `zerofill_dropped` |
| FLOAT(M,D) | BINARY_FLOAT oder BINARY_DOUBLE, ohne die Nachkommastellen | `float_scale_dropped` |
| DECIMAL(p,s) | NUMBER(p,s) bis 38 Stellen; darüber VARCHAR2 | `decimal_as_text` |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) bis 63 Bit, NUMBER(20) für BIT(64) |  |
| 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 entfernt | `not_null_relaxed` |
| empty strings and empty binary values | NULL | `empty_string_null` |
| DEFAULT '0000-00-00' | kein Standardwert | `zero_date_default` |
| TIME | INTERVAL DAY TO SECOND, das Dauern fasst |  |
| YEAR | NUMBER(4) mit einem CHECK seines Bereichs |  |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), zählt Zeichen |  |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOB | `text_as_lob` |
| DATETIME | TIMESTAMP |  |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE in der Zone, die der Dump angibt, UTC, wenn er keine angibt | `timestamp_zone_assumed` |
| ENUM | VARCHAR2 mit einem CHECK der erlaubten Werte |  |
| ENUM holding '' (MySQL's error value) | NULL |  |
| ENUM holding values outside its list | kein CHECK | `enum_check_skipped` |
| SET | VARCHAR2, wie MySQL es schreibt ('a,b') |  |
| JSON | CLOB |  |
| NUL bytes in text | beibehalten |  |
| text that isn't valid in its character set | die fehlerhaften Bytes als Ersatzzeichen | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | unverändert kopiert | `mojibake_suspected` |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, neu gestartet hinter den kopierten IDs |  |
| MyISAM AUTO_INCREMENT on the second column of a key | ein Zähler für die Tabelle | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | ein Trigger mit BEFORE UPDATE | `on_update_trigger` |
| generated columns | virtuelle Spalten | `stored_as_virtual` |
| generated columns with functions Oracle lacks | eine normale Spalte | `generated_not_translated` |
| INVISIBLE columns | INVISIBLE-Spalten |  |
| CHECK constraints | übersetzt, inline in CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | nicht angelegt | `check_skipped` |
| CHECK ... NOT ENFORCED | nicht angelegt | `check_not_enforced` |
| defaults with functions Oracle lacks | kein Standardwert | `default_not_translated` |
| keys and indexes on a prefix, c(20) | ein Index auf SUBSTR der Spalte | `prefix_unique` |
| FULLTEXT indexes | nicht angelegt | `fulltext_not_created` |
| SPATIAL indexes | nicht angelegt | `spatial_index_not_created` |
| functional indexes, and indexes on whole CLOB or BLOB columns | nicht angelegt | `index_skipped` |
| foreign keys | nach den Daten, ENABLE NOVALIDATE, dann validiert, mit einer Warnung bei verwaisten Zeilen |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | entfernt | `foreign_key_action_unsupported` |
| foreign keys to columns without a unique key | nicht angelegt | `foreign_key_skipped` |
| table and column names | in Großbuchstaben, wenn es einfache Namen sind, sonst wie geschrieben | `identifier_renamed` |
| names over 128 bytes | gekürzt | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | BLOB mit WKB | `geometry_as_blob` |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36) |  |
| BINARY, VARBINARY, BLOB | RAW bis 2000 Bytes, sonst BLOB |  |
| PARTITION BY | eine Tabelle | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | eine Tabelle mit den aktuellen Zeilen | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | eine normale Tabelle | `engine_dropped` |
| views, triggers, procedures, functions and events | im Bericht aufgeführt | `not_converted_objects` |
| dumps without CREATE TABLE | Typen aus den Werten gelesen | `no_schema` |
| geometries in a dump without CREATE TABLE | BLOB mit WKB | `geometry_inferred` |
| _ci collations | exakter Vergleich | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | konvertiert, mit einer Warnung | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | als Latin-1 (Windows-1252) gelesen | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | als UTF-8 gelesen, mit einer Warnung | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | ausgewertet |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | der Standardwert der Spalte | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | normale Zeilen | `replace_as_insert` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| dumps of several databases | ein Schema, jede Tabelle mit dem Namen ihrer Datenbank vorangestellt | `databases_merged` |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, beim erreichten Wert |  |
| VECTOR(n) (MariaDB 11.7+) | CLOB mit den Gleitkommazahlen als JSON-Array | `type_replaced` |

## Das Skript in Oracle laden

Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mysql.oracle.sql
```

Fremdschlüssel werden mit ENABLE NOVALIDATE hinzugefügt, sodass neue Zeilen sofort geprüft werden, und dann validiert. Verweist eine alte Zeile auf eine nicht vorhandene Zeile, nennt das Skript den Fremdschlüssel und lässt ihn unvalidiert, statt auf halbem Weg abzubrechen.

Führe bei einem großen Dump SQL*Plus auf dem Rechner der Datenbank aus. Das Skript schreibt alle 100 Zeilen fest. Der ausführende Benutzer braucht CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER und CREATE PROCEDURE sowie Quota auf seinem Tablespace.

## Den MySQL-Dump für das beste Ergebnis erstellen

Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:

- --default-character-set=utf8mb4 bewahrt Emoji und andere 4-Byte-Zeichen, die ein utf8-Dump verliert, bevor der Konverter ihn sieht.
- --hex-blob schreibt Binärspalten hexadezimal, was das Kopieren zwischen Systemen übersteht.
- --routines --triggers --events fügen diese Objekte dem Dump hinzu, damit der Bericht sie auflisten kann.

## Was nicht konvertiert wird

Sichten, Trigger, gespeicherte Prozeduren, Funktionen und Ereignisse sind in der eigenen Sprache jeder Datenbank geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für Oracle neu schreiben kannst.

## Fragen zu MySQL zu Oracle

### Wird mein Dump hochgeladen?

Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.

### Wie groß darf der Dump sein?

Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.

### Liest es MariaDB-Dumps?

Ja. Dumps aus mariadb-dump und aus MariaDB 10.3 bis 12 werden genauso konvertiert, einschließlich der INET6-, INET4- und UUID-Spalten von MariaDB.

### Was passiert mit dem Datum 0000-00-00?

Oracle kennt kein Null-Datum, daher werden diese Werte NULL, und die Spalte akzeptiert NULL. Der Bericht nennt, wie viele es in jeder Spalte waren. Leere Strings werden ebenfalls NULL, wie Oracle sie speichert.

### Bleiben AUTO_INCREMENT-Werte erhalten?

Ja. Jede AUTO_INCREMENT-Spalte wird eine Identity-Spalte, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter oder nach dem AUTO_INCREMENT der Tabelle, wenn das höher ist.

### Wird TINYINT(1) zu boolean?

Oracle vor 23ai hat keine boolesche Spalte. Eine Spalte, deren Werte alle 0 oder 1 sind, wird NUMBER(1) mit einer CHECK-Bedingung, die das sicherstellt; eine mit anderen Zahlen behält sie, und der Bericht sagt warum.

### Was ist mit gespeicherten Prozeduren und Triggern?

Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt. ON UPDATE CURRENT_TIMESTAMP ist die Ausnahme: Es wird ein Oracle-Trigger.

### Auf welchen Oracle-Versionen lädt das Skript?

Oracle 19c und neuer. Jeder Test-Dump lädt auf 21c und 23ai und hält beim ersten Fehler an, falls etwas schiefgeht.

## Aus MySQL

- [MySQL zu PostgreSQL](https://intosql.com/de/mysql-in-postgresql)
- [MySQL zu MySQL](https://intosql.com/de/mysql-in-mysql)
- [MySQL zu MariaDB](https://intosql.com/de/mysql-in-mariadb)
- [MySQL zu SQLite](https://intosql.com/de/mysql-in-sqlite)
- [MySQL zu SQL Server](https://intosql.com/de/mysql-in-sql-server)

## Nach Oracle

- [MariaDB zu Oracle](https://intosql.com/de/mariadb-in-oracle)
- [PostgreSQL zu Oracle](https://intosql.com/de/postgresql-in-oracle)
- [SQL Server zu Oracle](https://intosql.com/de/sql-server-in-oracle)
- [SQLite zu Oracle](https://intosql.com/de/sqlite-in-oracle)
- [Oracle zu Oracle](https://intosql.com/de/oracle-in-oracle)

## Leitfaden und alle Paare

- [Oracle zu MySQL](https://intosql.com/de/oracle-in-mysql)
- [Leitfaden: MySQL zu Oracle migrieren](https://intosql.com/docs/migrations/mysql-to-oracle)
- [Datentypen von MySQL zu Oracle](https://intosql.com/docs/types/mysql-to-oracle)
- [Alle Datenbankpaare](https://intosql.com/de/datenbankmigration)
