Zum Inhalt springen
IntoSQL-Startseite

MariaDB in SQLite umwandeln

Leg einen Dump aus mariadb-dump, mysqldump, 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.

Deine Datei
sqlshop_2024_mariadb.sqlBeispieldatei, 6,6 kB
Deine Datenbank

18 Zeilen konvertiert, 8 Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_mariadb.sqlMariaDB-11.8.9-MariaDB-ubu2404-Dump · erstellt mit mariadb-dump · utf8mb4

  • customers8 Zeilen3
    8 Spalten
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(150) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATE
    created_atTIMESTAMP not null
    last_ipTEXT
  • orders10 Zeilen5
    12 Spalten
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteVARCHAR(255)
    order_refTEXT not null
    invoiceINTEGER not null
    detailsTEXT
    updated_atTIMESTAMP not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    signed_up DATE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    last_ip TEXT,
    CONSTRAINT customers_id_check CHECK (id >= 0)
);

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    status TEXT DEFAULT 'pending' NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note VARCHAR(255),
    order_ref TEXT NOT NULL,
    invoice INTEGER NOT NULL,
    details TEXT,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT orders_id_check CHECK (id >= 0),
    CONSTRAINT orders_customer_id_check CHECK (customer_id >= 0),
    CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled', '')),
    CONSTRAINT orders_items_check CHECK (items >= 0),
    CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id)
);

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at, last_ip) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00','::ffff:203.0.113.7'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42','2001:db8::1'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17',NULL),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00','::ffff:198.51.100.23'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00',NULL),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00','2001:db8:85a3::8a2e:370:7334'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59','::ffff:192.0.2.200'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, order_ref, invoice, details, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,'{"gift": false}','2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,'{"gift": true, "wrap": "red"}','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,'{"fragile": true}','2024-03-07 08:00:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice','4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'2024-03-08 17:20:00'),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,'{"fragile": true}','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,NULL,'2024-03-11 18:46:00'),
(8,2,'',19.99,1,'2024-03-12 08:00:00',NULL,'Status lost in an old import','7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,'{"parcels": [1, 2]}','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'2024-03-15 21:05:00');

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_uq_email ON customers (email);
CREATE INDEX orders_idx_customer ON orders (customer_id);
CREATE INDEX orders_idx_status_date ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 1000) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 1000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 5000) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 5000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
CREATE TRIGGER orders_updated_at_on_update AFTER UPDATE ON orders FOR EACH ROW WHEN NEW.updated_at IS OLD.updated_at AND (NEW.id IS NOT OLD.id OR NEW.customer_id IS NOT OLD.customer_id OR NEW.status IS NOT OLD.status OR NEW.total IS NOT OLD.total OR NEW.items IS NOT OLD.items OR NEW.ordered_at IS NOT OLD.ordered_at OR NEW.shipped_at IS NOT OLD.shipped_at OR NEW.note IS NOT OLD.note OR NEW.order_ref IS NOT OLD.order_ref OR NEW.invoice IS NOT OLD.invoice OR NEW.details IS NOT OLD.details)
BEGIN
    UPDATE orders SET updated_at = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;
END;
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Korrekturen

  1. "id" von customers ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
  2. "signed_up" von customers erlaubt jetzt NULL: Einige Werte ließen sich nicht speichern und sind NULL.
  3. Der Standardwert von "signed_up" in customers, 0000‑00‑00, ist kein Datum, das SQLite akzeptiert, daher hat die Spalte keinen Standardwert.
  4. "customer_id" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
  5. "id" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
  6. "items" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
  7. 1 Zeile von "status" in orders enthält den leeren Wert, den MySQL für ungültige Einträge speichert; die CHECK-Bedingung der Spalte erlaubt ihn.
  8. "updated_at" von orders wird bei jeder Änderung auf die aktuelle Zeit gesetzt; in SQLite übernimmt das ein Trigger.

Zu prüfen

  • 1 Sequenz wird nicht angelegt; SQLite hat keine Sequenzen. Speichere den nächsten Wert in einer Tabelle, wenn deine Anwendung ihn braucht.
  • 1 Wert in "signed_up" von customers ist ein Null- oder unmögliches Datum wie 0000‑00‑00, was SQLite nicht speichern kann, daher ist er NULL. Wenn diese Datumsangaben etwas bedeuten, ersetze sie vor dem Dump in der Quelle durch echte.
  • Der Standardwert von "invoice" in orders lässt sich nicht für SQLite schreiben (a sequence), daher hat die Spalte keinen Standardwert. Füge den Standardwert von Hand hinzu, wenn neue Zeilen ihn brauchen.
  • 1 Wert in "shipped_at" von orders ist ein Null- oder unmögliches Datum wie 0000‑00‑00 00:00:00, was SQLite nicht speichern kann, daher ist er NULL. Wenn diese Datumsangaben etwas bedeuten, ersetze sie vor dem Dump in der Quelle durch echte.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von MariaDB 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.

  • TINYINT(1), BOOL

    INTEGER mit unveränderten Werten

    SQLite hat keinen booleschen Typ; true und false sind die Ganzzahlen 1 und 0, daher behält jeder Wert seine Bedeutung.

  • UNSIGNED integers

    INTEGER mit einem CHECK gegen negative Werte; BIGINT UNSIGNED mit Werten über 2^63-1 wird TEXT

    Ganzzahlen in SQLite haben 64 Bit und ein Vorzeichen. Die CHECK-Bedingung hält negative Werte fern wie in MySQL; Werte jenseits des vorzeichenbehafteten Bereichs bleiben Text, damit keine Stelle verloren geht.

    Berichtszeile: unsigned_widened

  • ZEROFILL and display widths

    entfernt

    Das Auffüllen mit Nullen ist eine Darstellung der Zahl, kein Teil davon. Die Zahlen bleiben erhalten; formatiere sie beim Lesen, wenn die Auffüllung wichtig ist.

    Berichtszeile: zerofill_dropped

  • FLOAT(M,D)

    REAL, ohne die Nachkommastellen

    Gleitkommazahlen in SQLite haben keine feste Skalierung. Die gespeicherten Werte werden unverändert kopiert.

    Berichtszeile: float_scale_dropped

  • DECIMAL(p,s)

    DECIMAL(p,s) bis 15 Stellen; darüber TEXT

    SQLite hält etwa 15 signifikante Stellen in einer Zahl. Breitere Dezimalzahlen bleiben Text, damit jede Stelle exakt bleibt.

    Berichtszeile: decimal_as_text

  • BIT(1), BIT(n)

    INTEGER mit dem Wert der Bits; BIT(64) als Ziffern in TEXT

    Ein Bitfeld wird als die Zahl gespeichert, die seine Bits ergeben. Das oberste Bit eines BIT(64) passt nicht in eine vorzeichenbehaftete Ganzzahl, daher bleibt seine Zahl Text.

  • zero, partial or impossible dates (0000-00-00, 2024-02-30)

    NULL

    Die Datumsfunktionen von SQLite lesen nur echte Kalenderdaten. Sie werden NULL, und der Bericht zählt sie, wie bei jeder anderen Datenbank.

    Berichtszeile: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL entfernt

    Eine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.

    Berichtszeile: not_null_relaxed

  • DEFAULT '0000-00-00'

    kein Standardwert

    Ein Standardwert, der kein echtes Datum ist, wird weggelassen, statt durch ein erfundenes ersetzt zu werden.

    Berichtszeile: zero_date_default

  • TIME

    TIME als Text, wie MySQL ihn schreibt, einschließlich Dauern

    SQLite speichert Zeiten als Text, daher bleiben Dauern über einen Tag oder unter null exakt erhalten.

  • YEAR

    INTEGER mit einem CHECK seines Bereichs

    SQLite hat keinen Jahrestyp; die CHECK-Bedingung behält dieselben Werte, die MySQL erlaubt.

  • CHAR(n), VARCHAR(n)

    VARCHAR(n), nicht erzwungen

    SQLite behält den deklarierten Typ für Werkzeuge, begrenzt aber die Länge nicht; die Werte sind die, die MySQL zurückgibt.

  • DATETIME

    DATETIME als ISO-8601-Text

    SQLite speichert Datumsangaben als Text, den seine Datumsfunktionen lesen.

  • TIMESTAMP

    TIMESTAMP als ISO-8601-Text in UTC; die Zone, die der Dump angibt, UTC, wenn er keine angibt

    Ein TIMESTAMP ist ein Zeitpunkt, in UTC geschrieben. Dumps geben die Zone an, in der sie ihn geschrieben haben (mysqldump schreibt UTC); ohne diese Angabe werden die Werte als UTC gelesen, und der Bericht sagt es.

    Berichtszeile: timestamp_zone_assumed

  • ENUM

    TEXT mit einem CHECK der erlaubten Werte

    Text mit einer CHECK-Bedingung behält dieselben Werte.

  • ENUM holding '' (MySQL's error value)

    der leere Wert, von der CHECK-Bedingung erlaubt

    MySQL speichert einen leeren String, wenn in einem nachsichtigen SQL-Modus ein ungültiger Wert in ein ENUM geschrieben wird. Diese Zeilen bleiben erhalten, und die CHECK-Bedingung erlaubt sie.

    Berichtszeile: enum_invalid_value

  • ENUM holding values outside its list

    kein CHECK

    Werte, die nicht in der Liste stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.

    Berichtszeile: enum_check_skipped

  • SET

    TEXT, wie MySQL ihn schreibt ('a,b')

    SQLite hat keine Arrays; der Text ist der, den MySQL zurückgibt.

  • JSON

    TEXT

    Die JSON-Funktionen von SQLite lesen JSON aus Text. Eine als JSON deklarierte Spalte würde "123" in eine Zahl umwandeln, daher ist sie TEXT.

  • NUL bytes in text

    beibehalten

    Text in SQLite kann ein NUL-Byte enthalten, daher wird der Wert unverändert kopiert.

  • text that isn't valid in its character set

    die fehlerhaften Bytes als Ersatzzeichen

    Text in SQLite ist UTF-8; seine Funktionen lesen Bytes, die es nicht sind, falsch.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

    Der Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.

    Berichtszeile: mojibake_suspected

  • AUTO_INCREMENT

    INTEGER PRIMARY KEY AUTOINCREMENT, mit dem Zähler hinter den kopierten IDs

    SQLite zählt einen ganzen ganzzahligen Primärschlüssel. AUTOINCREMENT verhindert, dass IDs wiederverwendet werden, wie in MySQL, und der Zähler macht nach der höchsten ID weiter oder nach dem AUTO_INCREMENT des Dumps, je nachdem, was höher ist.

  • AUTO_INCREMENT on part of a key or outside one

    INTEGER ohne Zähler

    SQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.

    Berichtszeile: identity_without_counter

  • ON UPDATE CURRENT_TIMESTAMP

    ein Trigger mit AFTER UPDATE

    Der Trigger setzt die Spalte auf die aktuelle Zeit, wenn sich eine Zeile ändert und die Änderung sie nicht gesetzt hat, wie in MySQL.

    Berichtszeile: on_update_trigger

  • generated columns

    GENERATED ALWAYS AS, VIRTUAL oder STORED wie in der Quelle

    SQLite 3.31 und neuer berechnet generierte Spalten auf dieselben zwei Arten.

  • generated columns with functions SQLite lacks

    eine normale Spalte

    Eine Formel, die sich nicht für SQLite schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht.

    Berichtszeile: generated_not_translated

  • INVISIBLE columns

    normale Spalten

    SQLite hat keine unsichtbaren Spalten.

    Berichtszeile: invisible_column

  • CHECK constraints

    übersetzt, inline in CREATE TABLE

    SQLite nimmt CHECK-Bedingungen nur in CREATE TABLE an.

  • CHECK constraints with functions SQLite lacks

    nicht angelegt

    Eine CHECK-Bedingung, die sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: check_skipped

  • CHECK ... NOT ENFORCED

    nicht angelegt

    MySQL behält diese CHECK-Bedingungen, ohne sie anzuwenden, daher können Zeilen sie verletzen.

    Berichtszeile: check_not_enforced

  • defaults with functions SQLite lacks

    kein Standardwert

    Ein Standardwert, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

  • keys and indexes on a prefix, c(20)

    ein Index auf substr(c, 1, 20)

    SQLite indiziert Ausdrücke, daher wird derselbe Präfix indiziert, und ein eindeutiger Präfix bleibt eindeutig.

    Berichtszeile: prefix_unique

  • FULLTEXT indexes

    nicht angelegt

    SQLite durchsucht Text mit separaten FTS5-Tabellen, die eigene Abfragen brauchen.

    Berichtszeile: fulltext_not_created

  • SPATIAL indexes

    nicht angelegt

    SQLite hat keinen räumlichen Index auf einer Spalte.

    Berichtszeile: spatial_index_not_created

  • functional indexes SQLite can't write

    nicht angelegt

    Ein Index auf einem Ausdruck, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: index_skipped

  • foreign keys

    in CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistet

    SQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft wie aus MySQL, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.

  • foreign keys to columns without a unique key

    nicht angelegt

    SQLite braucht einen eindeutigen Schlüssel auf den referenzierten Spalten; InnoDB nicht.

    Berichtszeile: 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

    Namen in SQLite ignorieren die Groß-/Kleinschreibung, und Indexnamen teilen sich einen Namensraum pro Datenbank.

    Berichtszeile: identifier_renamed

  • GEOMETRY, POINT, POLYGON...

    WKB in einem BLOB

    Das Standardformat Well-known Binary bewahrt jede Geometrie exakt.

    Berichtszeile: geometry_as_blob

  • INET4, INET6, UUID (MariaDB)

    TEXT

    SQLite hat solche Typen nicht; der Text ist der, den MariaDB zurückgibt.

  • BINARY, VARBINARY, BLOB

    BLOB

    Bytes bleiben Bytes.

  • PARTITION BY

    eine Tabelle

    Die Zeilen bleiben dieselben.

    Berichtszeile: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    eine Tabelle mit den aktuellen Zeilen

    Ein Dump enthält nur die aktuellen Zeilen.

    Berichtszeile: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    eine normale Tabelle

    SQLite hat eine einzige Tabellen-Engine.

    Berichtszeile: engine_dropped

  • dumps of several databases

    eine Datei, jede Tabelle mit dem Namen ihrer Datenbank vorangestellt

    Eine SQLite-Datei ist eine Datenbank, daher hält der Datenbankname gleichnamige Tabellen auseinander.

    Berichtszeile: databases_merged

  • views, triggers, procedures, functions and events

    im Bericht aufgeführt

    Ihr Code ist in der Sprache von MySQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • dumps without CREATE TABLE

    Typen aus den Werten gelesen

    Ein mit --no-create-info erstellter Dump enthält nur Zeilen, daher kommen die Typen aus den Werten.

    Berichtszeile: no_schema

  • geometries in a dump without CREATE TABLE

    WKB in einem BLOB

    Das Geometrieformat von MySQL wird an den Werten erkannt und als Standard-WKB gespeichert.

    Berichtszeile: geometry_as_blob

  • _ci collations

    exakter Vergleich

    SQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.

    Berichtszeile: case_insensitive_collation

  • SET NAMES utf8 from utf8mb4 tables

    konvertiert, mit einer Warnung

    mysqldump aus MySQL 5.x schreibt standardmäßig 3-Byte-utf8 und ersetzt jedes Emoji durch ein Fragezeichen, bevor ein Konverter die Datei sieht.

    Berichtszeile: dump_lost_four_byte_chars

  • dumps without SET NAMES whose text isn't UTF-8

    als Latin-1 (Windows-1252) gelesen

    latin1 in MySQL ist Windows-1252, die übliche Kodierung solcher Dumps.

    Berichtszeile: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    als UTF-8 gelesen, mit einer Warnung

    Diese Kodierungen werden noch nicht dekodiert.

    Berichtszeile: unsupported_charset

  • UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows

    ausgewertet

    Manche Dump-Werkzeuge schreiben Werte als solche Aufrufe; sie werden als die Werte gelesen, die sie ergeben, wobei geografisches WKT auf Längengrad zuerst umgestellt wird.

  • other expressions in rows

    NULL

    Ein Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.

    Berichtszeile: expression_value

  • DEFAULT in VALUES

    der Standardwert der Spalte

    Ein literaler Standardwert wird in die Zeile kopiert.

    Berichtszeile: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Es gibt keinen Wert zum Kopieren.

    Berichtszeile: default_keyword_null

  • REPLACE and INSERT IGNORE

    normale Zeilen

    Ein Dump hat eine Zeile pro Schlüssel, daher sind die Zeilen dieselben.

    Berichtszeile: replace_as_insert

  • types IntoSQL doesn't know

    TEXT

    Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.

    Berichtszeile: unknown_type

  • values that don't fit their column

    NULL

    Ein beschädigter oder von Hand geschriebener Dump kann Werte enthalten, die seine Spalte nicht aufnehmen kann; sie werden NULL, damit der Rest lädt.

    Berichtszeile: invalid_value_null

  • unreadable geometries

    NULL

    Bytes, die keine Geometrie sind, lassen sich nicht als solche speichern.

    Berichtszeile: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    nicht angelegt

    SQLite hat keine Sequenzen.

    Berichtszeile: sequence_not_converted

  • VECTOR(n) (MariaDB 11.7+)

    TEXT mit den Gleitkommazahlen als JSON-Array

    SQLite hat keinen vector-Typ; ein JSON-Array behält jede Gleitkommazahl.

    Berichtszeile: type_replaced

In MariaDBIn SQLiteBerichtszeile
TINYINT(1), BOOLINTEGER mit unveränderten WertenSQLite hat keinen booleschen Typ; true und false sind die Ganzzahlen 1 und 0, daher behält jeder Wert seine Bedeutung.
UNSIGNED integersINTEGER mit einem CHECK gegen negative Werte; BIGINT UNSIGNED mit Werten über 2^63-1 wird TEXTGanzzahlen in SQLite haben 64 Bit und ein Vorzeichen. Die CHECK-Bedingung hält negative Werte fern wie in MySQL; Werte jenseits des vorzeichenbehafteten Bereichs bleiben Text, damit keine Stelle verloren geht.unsigned_widened
ZEROFILL and display widthsentferntDas Auffüllen mit Nullen ist eine Darstellung der Zahl, kein Teil davon. Die Zahlen bleiben erhalten; formatiere sie beim Lesen, wenn die Auffüllung wichtig ist.zerofill_dropped
FLOAT(M,D)REAL, ohne die NachkommastellenGleitkommazahlen in SQLite haben keine feste Skalierung. Die gespeicherten Werte werden unverändert kopiert.float_scale_dropped
DECIMAL(p,s)DECIMAL(p,s) bis 15 Stellen; darüber TEXTSQLite hält etwa 15 signifikante Stellen in einer Zahl. Breitere Dezimalzahlen bleiben Text, damit jede Stelle exakt bleibt.decimal_as_text
BIT(1), BIT(n)INTEGER mit dem Wert der Bits; BIT(64) als Ziffern in TEXTEin Bitfeld wird als die Zahl gespeichert, die seine Bits ergeben. Das oberste Bit eines BIT(64) passt nicht in eine vorzeichenbehaftete Ganzzahl, daher bleibt seine Zahl Text.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLDie Datumsfunktionen von SQLite lesen nur echte Kalenderdaten. Sie werden NULL, und der Bericht zählt sie, wie bei jeder anderen Datenbank.invalid_date_null
NOT NULL columns with values that become NULLNOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.not_null_relaxed
DEFAULT '0000-00-00'kein StandardwertEin Standardwert, der kein echtes Datum ist, wird weggelassen, statt durch ein erfundenes ersetzt zu werden.zero_date_default
TIMETIME als Text, wie MySQL ihn schreibt, einschließlich DauernSQLite speichert Zeiten als Text, daher bleiben Dauern über einen Tag oder unter null exakt erhalten.
YEARINTEGER mit einem CHECK seines BereichsSQLite hat keinen Jahrestyp; die CHECK-Bedingung behält dieselben Werte, die MySQL erlaubt.
CHAR(n), VARCHAR(n)VARCHAR(n), nicht erzwungenSQLite behält den deklarierten Typ für Werkzeuge, begrenzt aber die Länge nicht; die Werte sind die, die MySQL zurückgibt.
DATETIMEDATETIME als ISO-8601-TextSQLite speichert Datumsangaben als Text, den seine Datumsfunktionen lesen.
TIMESTAMPTIMESTAMP als ISO-8601-Text in UTC; die Zone, die der Dump angibt, UTC, wenn er keine angibtEin TIMESTAMP ist ein Zeitpunkt, in UTC geschrieben. Dumps geben die Zone an, in der sie ihn geschrieben haben (mysqldump schreibt UTC); ohne diese Angabe werden die Werte als UTC gelesen, und der Bericht sagt es.timestamp_zone_assumed
ENUMTEXT mit einem CHECK der erlaubten WerteText mit einer CHECK-Bedingung behält dieselben Werte.
ENUM holding '' (MySQL's error value)der leere Wert, von der CHECK-Bedingung erlaubtMySQL speichert einen leeren String, wenn in einem nachsichtigen SQL-Modus ein ungültiger Wert in ein ENUM geschrieben wird. Diese Zeilen bleiben erhalten, und die CHECK-Bedingung erlaubt sie.enum_invalid_value
ENUM holding values outside its listkein CHECKWerte, die nicht in der Liste stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.enum_check_skipped
SETTEXT, wie MySQL ihn schreibt ('a,b')SQLite hat keine Arrays; der Text ist der, den MySQL zurückgibt.
JSONTEXTDie JSON-Funktionen von SQLite lesen JSON aus Text. Eine als JSON deklarierte Spalte würde "123" in eine Zahl umwandeln, daher ist sie TEXT.
NUL bytes in textbeibehaltenText in SQLite kann ein NUL-Byte enthalten, daher wird der Wert unverändert kopiert.
text that isn't valid in its character setdie fehlerhaften Bytes als ErsatzzeichenText in SQLite ist UTF-8; seine Funktionen lesen Bytes, die es nicht sind, falsch.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDer Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected
AUTO_INCREMENTINTEGER PRIMARY KEY AUTOINCREMENT, mit dem Zähler hinter den kopierten IDsSQLite zählt einen ganzen ganzzahligen Primärschlüssel. AUTOINCREMENT verhindert, dass IDs wiederverwendet werden, wie in MySQL, und der Zähler macht nach der höchsten ID weiter oder nach dem AUTO_INCREMENT des Dumps, je nachdem, was höher ist.
AUTO_INCREMENT on part of a key or outside oneINTEGER ohne ZählerSQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.identity_without_counter
ON UPDATE CURRENT_TIMESTAMPein Trigger mit AFTER UPDATEDer Trigger setzt die Spalte auf die aktuelle Zeit, wenn sich eine Zeile ändert und die Änderung sie nicht gesetzt hat, wie in MySQL.on_update_trigger
generated columnsGENERATED ALWAYS AS, VIRTUAL oder STORED wie in der QuelleSQLite 3.31 und neuer berechnet generierte Spalten auf dieselben zwei Arten.
generated columns with functions SQLite lackseine normale SpalteEine Formel, die sich nicht für SQLite schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht.generated_not_translated
INVISIBLE columnsnormale SpaltenSQLite hat keine unsichtbaren Spalten.invisible_column
CHECK constraintsübersetzt, inline in CREATE TABLESQLite nimmt CHECK-Bedingungen nur in CREATE TABLE an.
CHECK constraints with functions SQLite lacksnicht angelegtEine CHECK-Bedingung, die sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK ... NOT ENFORCEDnicht angelegtMySQL behält diese CHECK-Bedingungen, ohne sie anzuwenden, daher können Zeilen sie verletzen.check_not_enforced
defaults with functions SQLite lackskein StandardwertEin Standardwert, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.default_not_translated
keys and indexes on a prefix, c(20)ein Index auf substr(c, 1, 20)SQLite indiziert Ausdrücke, daher wird derselbe Präfix indiziert, und ein eindeutiger Präfix bleibt eindeutig.prefix_unique
FULLTEXT indexesnicht angelegtSQLite durchsucht Text mit separaten FTS5-Tabellen, die eigene Abfragen brauchen.fulltext_not_created
SPATIAL indexesnicht angelegtSQLite hat keinen räumlichen Index auf einer Spalte.spatial_index_not_created
functional indexes SQLite can't writenicht angelegtEin Index auf einem Ausdruck, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.index_skipped
foreign keysin CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistetSQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft wie aus MySQL, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.
foreign keys to columns without a unique keynicht angelegtSQLite braucht einen eindeutigen Schlüssel auf den referenzierten Spalten; InnoDB nicht.foreign_key_skipped
table, index and column nameswie geschrieben; umbenannt, wenn sie sich nur in der Groß-/Kleinschreibung unterscheiden oder sich ein Indexname wiederholtNamen in SQLite ignorieren die Groß-/Kleinschreibung, und Indexnamen teilen sich einen Namensraum pro Datenbank.identifier_renamed
GEOMETRY, POINT, POLYGON...WKB in einem BLOBDas Standardformat Well-known Binary bewahrt jede Geometrie exakt.geometry_as_blob
INET4, INET6, UUID (MariaDB)TEXTSQLite hat solche Typen nicht; der Text ist der, den MariaDB zurückgibt.
BINARY, VARBINARY, BLOBBLOBBytes bleiben Bytes.
PARTITION BYeine TabelleDie Zeilen bleiben dieselben.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)eine Tabelle mit den aktuellen ZeilenEin Dump enthält nur die aktuellen Zeilen.system_versioning_dropped
MyISAM, MEMORY and other engineseine normale TabelleSQLite hat eine einzige Tabellen-Engine.engine_dropped
dumps of several databaseseine Datei, jede Tabelle mit dem Namen ihrer Datenbank vorangestelltEine SQLite-Datei ist eine Datenbank, daher hält der Datenbankname gleichnamige Tabellen auseinander.databases_merged
views, triggers, procedures, functions and eventsim Bericht aufgeführtIhr Code ist in der Sprache von MySQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
dumps without CREATE TABLETypen aus den Werten gelesenEin mit --no-create-info erstellter Dump enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
geometries in a dump without CREATE TABLEWKB in einem BLOBDas Geometrieformat von MySQL wird an den Werten erkannt und als Standard-WKB gespeichert.geometry_as_blob
_ci collationsexakter VergleichSQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tableskonvertiert, mit einer Warnungmysqldump aus MySQL 5.x schreibt standardmäßig 3-Byte-utf8 und ersetzt jedes Emoji durch ein Fragezeichen, bevor ein Konverter die Datei sieht.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8als Latin-1 (Windows-1252) gelesenlatin1 in MySQL ist Windows-1252, die übliche Kodierung solcher Dumps.charset_guessed
sjis, cp932, gbk, big5 dumpsals UTF-8 gelesen, mit einer WarnungDiese Kodierungen werden noch nicht dekodiert.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsausgewertetManche Dump-Werkzeuge schreiben Werte als solche Aufrufe; sie werden als die Werte gelesen, die sie ergeben, wobei geografisches WKT auf Längengrad zuerst umgestellt wird.
other expressions in rowsNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.expression_value
DEFAULT in VALUESder Standardwert der SpalteEin literaler Standardwert wird in die Zeile kopiert.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLEs gibt keinen Wert zum Kopieren.default_keyword_null
REPLACE and INSERT IGNOREnormale ZeilenEin Dump hat eine Zeile pro Schlüssel, daher sind die Zeilen dieselben.replace_as_insert
types IntoSQL doesn't knowTEXTText nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
values that don't fit their columnNULLEin beschädigter oder von Hand geschriebener Dump kann Werte enthalten, die seine Spalte nicht aufnehmen kann; sie werden NULL, damit der Rest lädt.invalid_value_null
unreadable geometriesNULLBytes, die keine Geometrie sind, lassen sich nicht als solche speichern.bad_geometry
CREATE SEQUENCE (MariaDB)nicht angelegtSQLite hat keine Sequenzen.sequence_not_converted
VECTOR(n) (MariaDB 11.7+)TEXT mit den Gleitkommazahlen als JSON-ArraySQLite hat keinen vector-Typ; ein JSON-Array behält jede Gleitkommazahl.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.

sqlite3 -bail mydb.sqlite < mariadb.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 MariaDB-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 utf8mb3-Dump verliert, bevor der Konverter ihn sieht.
  • --hex-blob schreibt Binärspalten und VECTOR-Werte 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 von MariaDB geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQLite neu schreiben kannst.

Fragen zu MariaDB zu SQLite

Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite

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.

Aus welchen MariaDB-Versionen kann der Dump stammen?

Dumps aus mariadb-dump und mysqldump auf MariaDB 10.3 bis 12, mit einem INSERT pro Tabelle oder einem pro Zeile. Jeder Test-Dump stammt aus MariaDB 10.11, 11.4 und 11.8 und wird Zelle für Zelle mit seiner Quelle verglichen.

Bleiben UUID-, INET6-, JSON- und VECTOR-Spalten erhalten?

UUID- und INET-Spalten werden text, JSON text und VECTOR ein JSON-Array seiner Gleitkommazahlen. Null-Daten werden NULL, und der Bericht zählt sie.

Bleiben AUTO_INCREMENT-Werte und Sequenzen erhalten?

Eine AUTO_INCREMENT-Spalte, die den ganzen Primärschlüssel der Tabelle bildet, wird INTEGER PRIMARY KEY AUTOINCREMENT und macht nach der höchsten ID weiter. SQLite hat keine Sequenzen, daher stehen sie im Bericht.

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.

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.