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.
18 Zeilen konvertiert, 8 Korrekturen, keine abgelehnt
Tabellen in shop_2024_mariadb.sqlMariaDB-11.8.9-MariaDB-ubu2404-Dump · erstellt mit mariadb-dump · utf8mb4
customers8 Zeilen3
8 Spalten id INTEGER not null name VARCHAR(100) not null email VARCHAR(150) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATE created_at TIMESTAMP not null last_ip TEXT orders10 Zeilen5
12 Spalten id INTEGER not null customer_id INTEGER not null status TEXT not null total DECIMAL(10,2) not null items INTEGER 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 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
- "id" von customers ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
- "signed_up" von customers erlaubt jetzt NULL: Einige Werte ließen sich nicht speichern und sind NULL.
- Der Standardwert von "signed_up" in customers, 0000‑00‑00, ist kein Datum, das SQLite akzeptiert, daher hat die Spalte keinen Standardwert.
- "customer_id" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
- "id" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
- "items" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
- 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.
- "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 MariaDB | In SQLite | Berichtszeile |
|---|---|---|
| TINYINT(1), BOOL | INTEGER 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 integers | INTEGER 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 widths | entferntDas 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 NULL | NOT 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 |
| TIME | TIME als Text, wie MySQL ihn schreibt, einschließlich DauernSQLite speichert Zeiten als Text, daher bleiben Dauern über einen Tag oder unter null exakt erhalten. | |
| YEAR | INTEGER 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. | |
| DATETIME | DATETIME als ISO-8601-TextSQLite 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 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 |
| ENUM | TEXT 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 list | kein CHECKWerte, die nicht in der Liste stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt. | enum_check_skipped |
| SET | TEXT, wie MySQL ihn schreibt ('a,b')SQLite hat keine Arrays; der Text ist der, den MySQL zurückgibt. | |
| JSON | TEXTDie 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 | beibehaltenText 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 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_INCREMENT | INTEGER 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 one | INTEGER 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_TIMESTAMP | ein 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 columns | GENERATED 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 lacks | eine 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 columns | normale 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 lacks | nicht angelegtEine CHECK-Bedingung, die sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet. | check_skipped |
| CHECK ... NOT ENFORCED | nicht angelegtMySQL behält diese CHECK-Bedingungen, ohne sie anzuwenden, daher können Zeilen sie verletzen. | check_not_enforced |
| defaults with functions SQLite lacks | kein 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 indexes | nicht angelegtSQLite durchsucht Text mit separaten FTS5-Tabellen, die eigene Abfragen brauchen. | fulltext_not_created |
| SPATIAL indexes | nicht angelegtSQLite hat keinen räumlichen Index auf einer Spalte. | spatial_index_not_created |
| functional indexes SQLite can't write | nicht angelegtEin Index auf einem Ausdruck, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet. | index_skipped |
| foreign keys | in 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 key | nicht angelegtSQLite braucht einen eindeutigen Schlüssel auf den referenzierten Spalten; InnoDB nicht. | foreign_key_skipped |
| table, index and column names | wie 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, BLOB | BLOBBytes bleiben Bytes. | |
| PARTITION BY | eine 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 engines | eine normale TabelleSQLite hat eine einzige Tabellen-Engine. | engine_dropped |
| dumps of several databases | eine 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 events | im 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 TABLE | Typen 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 TABLE | WKB in einem BLOBDas Geometrieformat von MySQL wird an den Werten erkannt und als Standard-WKB gespeichert. | geometry_as_blob |
| _ci collations | exakter VergleichSQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | konvertiert, 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-8 | als Latin-1 (Windows-1252) gelesenlatin1 in MySQL ist Windows-1252, die übliche Kodierung solcher Dumps. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | als UTF-8 gelesen, mit einer WarnungDiese Kodierungen werden noch nicht dekodiert. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | ausgewertetManche 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 | NULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten. | expression_value |
| DEFAULT in VALUES | der Standardwert der SpalteEin literaler Standardwert wird in die Zeile kopiert. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLEs gibt keinen Wert zum Kopieren. | default_keyword_null |
| REPLACE and INSERT IGNORE | normale ZeilenEin Dump hat eine Zeile pro Schlüssel, daher sind die Zeilen dieselben. | replace_as_insert |
| types IntoSQL doesn't know | TEXTText nimmt jeden Wert auf; ändere den Typ nach dem Laden. | unknown_type |
| values that don't fit their column | NULLEin 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 geometries | NULLBytes, 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.sqlFremdschlü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.