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

# MySQL zu SQLite migrieren, im Browser

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

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

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

## Was sich von MySQL zu SQLite ä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 SQLite | Berichtszeile |
| --- | --- | --- |
| TINYINT(1), BOOL | INTEGER mit unveränderten Werten |  |
| UNSIGNED integers | INTEGER mit einem CHECK gegen negative Werte; BIGINT UNSIGNED mit Werten über 2^63-1 wird TEXT | `unsigned_widened` |
| ZEROFILL and display widths | entfernt | `zerofill_dropped` |
| FLOAT(M,D) | REAL, ohne die Nachkommastellen | `float_scale_dropped` |
| DECIMAL(p,s) | DECIMAL(p,s) bis 15 Stellen; darüber TEXT | `decimal_as_text` |
| BIT(1), BIT(n) | INTEGER mit dem Wert der Bits; BIT(64) als Ziffern in TEXT |  |
| 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` |
| DEFAULT '0000-00-00' | kein Standardwert | `zero_date_default` |
| TIME | TIME als Text, wie MySQL ihn schreibt, einschließlich Dauern |  |
| YEAR | INTEGER mit einem CHECK seines Bereichs |  |
| CHAR(n), VARCHAR(n) | VARCHAR(n), nicht erzwungen |  |
| DATETIME | DATETIME als ISO-8601-Text |  |
| TIMESTAMP | TIMESTAMP als ISO-8601-Text in UTC; die Zone, die der Dump angibt, UTC, wenn er keine angibt | `timestamp_zone_assumed` |
| ENUM | TEXT mit einem CHECK der erlaubten Werte |  |
| ENUM holding '' (MySQL's error value) | der leere Wert, von der CHECK-Bedingung erlaubt | `enum_invalid_value` |
| ENUM holding values outside its list | kein CHECK | `enum_check_skipped` |
| SET | TEXT, wie MySQL ihn schreibt ('a,b') |  |
| JSON | TEXT |  |
| 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 | INTEGER PRIMARY KEY AUTOINCREMENT, mit dem Zähler hinter den kopierten IDs |  |
| AUTO_INCREMENT on part of a key or outside one | INTEGER ohne Zähler | `identity_without_counter` |
| ON UPDATE CURRENT_TIMESTAMP | ein Trigger mit AFTER UPDATE | `on_update_trigger` |
| generated columns | GENERATED ALWAYS AS, VIRTUAL oder STORED wie in der Quelle |  |
| generated columns with functions SQLite lacks | eine normale Spalte | `generated_not_translated` |
| INVISIBLE columns | normale Spalten | `invisible_column` |
| CHECK constraints | übersetzt, inline in CREATE TABLE |  |
| CHECK constraints with functions SQLite lacks | nicht angelegt | `check_skipped` |
| CHECK ... NOT ENFORCED | nicht angelegt | `check_not_enforced` |
| defaults with functions SQLite lacks | kein Standardwert | `default_not_translated` |
| keys and indexes on a prefix, c(20) | ein Index auf substr(c, 1, 20) | `prefix_unique` |
| FULLTEXT indexes | nicht angelegt | `fulltext_not_created` |
| SPATIAL indexes | nicht angelegt | `spatial_index_not_created` |
| functional indexes SQLite can't write | nicht angelegt | `index_skipped` |
| foreign keys | in CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistet |  |
| foreign keys to columns without a unique key | nicht angelegt | `foreign_key_skipped` |
| table, index and column names | wie geschrieben; umbenannt, wenn sie sich nur in der Groß-/Kleinschreibung unterscheiden oder sich ein Indexname wiederholt | `identifier_renamed` |
| GEOMETRY, POINT, POLYGON... | WKB in einem BLOB | `geometry_as_blob` |
| INET4, INET6, UUID (MariaDB) | TEXT |  |
| BINARY, VARBINARY, BLOB | 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` |
| dumps of several databases | eine Datei, jede Tabelle mit dem Namen ihrer Datenbank vorangestellt | `databases_merged` |
| 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 | WKB in einem BLOB | `geometry_as_blob` |
| _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 | TEXT | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| CREATE SEQUENCE (MariaDB) | nicht angelegt | `sequence_not_converted` |
| VECTOR(n) (MariaDB 11.7+) | TEXT mit den Gleitkommazahlen als JSON-Array | `type_replaced` |

## Das Skript in SQLite 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
sqlite3 -bail mydb.sqlite < mysql.sqlite.sql
```

Fremdschlüssel werden in jeder Tabelle deklariert, und die Zeilen laden mit ausgeschalteter Fremdschlüsselprüfung. Danach listet das Skript jede Zeile auf, die auf eine nicht vorhandene Zeile verweist, statt auf halbem Weg abzubrechen.

Lade einen großen Dump in eine neue Datei auf einer lokalen Festplatte. Das Skript lädt alles in einer Transaktion ohne Synchronisierung, so läuft es mit Festplattengeschwindigkeit, und ein abgebrochenes Laden hinterlässt keine halben Tabellen.

Die Kommandozeile lädt die Datei direkt in eine SQLite-Datenbank, ohne ein Skript zu schreiben. Das ist kostenlos.

## 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 SQLite neu schreiben kannst.

## Fragen zu MySQL zu SQLite

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

Sie werden NULL: SQLite würde den Text speichern, aber nichts liest 0000-00-00 als Datum. Der Bericht nennt, wie viele es in jeder Spalte waren.

### Bleiben AUTO_INCREMENT-Werte erhalten?

Ja. Eine AUTO_INCREMENT-Spalte, die den ganzen Primärschlüssel der Tabelle bildet, wird INTEGER PRIMARY KEY AUTOINCREMENT, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter. Jede andere AUTO_INCREMENT-Spalte behält ihre Werte ohne Zähler, und der Bericht sagt es.

### Wird TINYINT(1) zu boolean?

Nein. SQLite hat keinen booleschen Typ, daher ist TINYINT(1) ein INTEGER, und jeder Wert bleibt unverändert.

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

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

SQLite 3.31 und neuer. Jeder Test-Dump lädt auf 3.31 und 3.54 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 SQL Server](https://intosql.com/de/mysql-in-sql-server)
- [MySQL zu Oracle](https://intosql.com/de/mysql-in-oracle)

## Nach SQLite

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

## Leitfaden und alle Paare

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