MySQL omzetten naar SQLite
Zet een dump van mysqldump, mariadb-dump, mysqlpump, phpMyAdmin of Adminer neer, als .sql of .sql.gz, en download een SQLite-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die SQLite niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.
18 rijen geconverteerd, 8 correcties, geen afgewezen
Tabellen in shop_2024.sqlMySQL 8.0.46-dump · geschreven door mysqldump · utf8mb4
customers8 rijen3
7 kolommen 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 orders10 rijen5
9 kolommen 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) 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,
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),
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) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17'),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00'),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','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','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"','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,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','2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','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)
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;
Correcties
- "id" van customers is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
- "signed_up" van customers staat nu NULL toe: sommige waarden konden niet worden opgeslagen en zijn NULL.
- De standaardwaarde van "signed_up" in customers, 0000‑00‑00, is geen datum die SQLite accepteert, dus de kolom heeft geen standaardwaarde.
- "customer_id" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
- "id" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
- "items" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
- 1 rij van "status" in orders bevat de lege waarde die MySQL opslaat voor ongeldige invoer; de check op de waarden staat die toe.
- "updated_at" van orders verandert bij elke update in de huidige tijd; in SQLite doet een trigger dat.
Na te kijken
- 1 waarde in "signed_up" van customers is een nul- of onmogelijke datum zoals 0000‑00‑00, die SQLite niet kan opslaan, dus die is NULL. Als die datums iets betekenen, vervang ze dan in de bron door echte datums voordat je de dump maakt.
- 1 waarde in "shipped_at" van orders is een nul- of onmogelijke datum zoals 0000‑00‑00 00:00:00, die SQLite niet kan opslaan, dus die is NULL. Als die datums iets betekenen, vervang ze dan in de bron door echte datums voordat je de dump maakt.
Je bestand wordt op deze computer omgezet en nooit geüpload.
Andere voorbeelden:
Wat er verandert van MySQL naar SQLite
Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.
TINYINT(1), BOOL
INTEGER met de waarden ongewijzigd
SQLite heeft geen boolean-type; true en false zijn de gehele getallen 1 en 0, dus elke waarde behoudt zijn betekenis.
UNSIGNED integers
INTEGER met een CHECK dat het niet negatief is; BIGINT UNSIGNED met waarden boven 2^63-1 wordt TEXT
Gehele getallen in SQLite zijn 64-bits en signed. De check houdt negatieve waarden buiten, zoals MySQL deed; waarden buiten het signed bereik blijven tekst, zodat geen cijfer verloren gaat.
Rapportregel: unsigned_widened
ZEROFILL and display widths
weggelaten
Opvulling met nullen is een manier om een getal te tonen, geen deel ervan. De getallen blijven; formatteer ze bij het lezen als de opvulling ertoe doet.
Rapportregel: zerofill_dropped
FLOAT(M,D)
REAL, zonder de schaal
Drijvendekommagetallen in SQLite hebben geen vaste schaal. De opgeslagen waarden worden ongewijzigd gekopieerd.
Rapportregel: float_scale_dropped
DECIMAL(p,s)
DECIMAL(p,s) tot 15 cijfers; daarboven TEXT
SQLite bewaart ongeveer 15 significante cijfers in een getal. Bredere decimalen blijven tekst, zodat elk cijfer exact blijft.
Rapportregel: decimal_as_text
BIT(1), BIT(n)
INTEGER met de waarde van de bits; BIT(64) als TEXT-cijfers
Een bitveld wordt opgeslagen als het getal dat zijn bits vormen. De hoogste bit van een BIT(64) past niet in een signed geheel getal, dus dat getal blijft tekst.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
De datumfuncties van SQLite lezen alleen echte kalenderdatums. Ze worden NULL en het rapport telt ze, zoals bij elke andere database.
Rapportregel: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL weggelaten
Een kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.
Rapportregel: not_null_relaxed
DEFAULT '0000-00-00'
geen standaardwaarde
Een standaardwaarde die geen echte datum is, wordt weggelaten in plaats van vervangen door een verzonnen datum.
Rapportregel: zero_date_default
TIME
TIME-tekst zoals MySQL hem schrijft, inclusief duren
SQLite bewaart tijden als tekst, dus duren van meer dan een dag of onder nul blijven exact.
YEAR
INTEGER met een CHECK op het bereik
SQLite heeft geen jaartype; de check houdt dezelfde waarden die MySQL toestaat.
CHAR(n), VARCHAR(n)
VARCHAR(n), niet afgedwongen
SQLite bewaart het gedeclareerde type zodat tools het kunnen lezen, maar beperkt de lengte niet; de waarden zijn die MySQL teruggeeft.
DATETIME
DATETIME als ISO 8601-tekst
SQLite slaat datums op als tekst die zijn datumfuncties lezen.
TIMESTAMP
TIMESTAMP als ISO 8601-tekst in UTC; de zone die de dump vermeldt, UTC als die er geen vermeldt
Een TIMESTAMP is een moment, geschreven in UTC. Dumps vermelden de zone waarin ze het schreven (mysqldump schrijft UTC); zonder die vermelding worden de waarden gelezen als UTC en meldt het rapport dat.
Rapportregel: timestamp_zone_assumed
ENUM
TEXT met een CHECK op de waarden
Tekst met een check houdt dezelfde waarden.
ENUM holding '' (MySQL's error value)
de lege waarde, toegestaan door de check
MySQL slaat een lege string op als er in een tolerante SQL-modus een ongeldige waarde in een ENUM komt. Die rijen blijven behouden en de check staat ze toe.
Rapportregel: enum_invalid_value
ENUM holding values outside its list
geen CHECK
Waarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt.
Rapportregel: enum_check_skipped
SET
TEXT zoals MySQL het schrijft ('a,b')
SQLite heeft geen arrays; de tekst is die MySQL teruggeeft.
JSON
TEXT
De JSON-functies van SQLite lezen JSON uit tekst. Een kolom gedeclareerd als JSON zou "123" in een getal veranderen, dus het is TEXT.
NUL bytes in text
behouden
Tekst in SQLite kan een NUL-byte bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its character set
de foute bytes als het vervangingsteken
Tekst in SQLite is UTF-8; zijn functies lezen bytes die dat niet zijn verkeerd.
Rapportregel: invalid_utf8_replaced
text decoded twice (ñ)
ongewijzigd gekopieerd
De dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.
Rapportregel: mojibake_suspected
AUTO_INCREMENT
INTEGER PRIMARY KEY AUTOINCREMENT, met de teller voorbij de gekopieerde id's
SQLite telt een hele primaire sleutel van gehele getallen. AUTOINCREMENT voorkomt dat id's opnieuw worden gebruikt, zoals MySQL doet, en de teller gaat verder na het hoogste id of de AUTO_INCREMENT van de dump, welke hoger is.
AUTO_INCREMENT on part of a key or outside one
INTEGER zonder teller
SQLite telt alleen een kolom die de hele primaire sleutel is, dus de kolom behoudt zijn waarden en nieuwe rijen hebben hun eigen waarden nodig.
Rapportregel: identity_without_counter
ON UPDATE CURRENT_TIMESTAMP
een AFTER UPDATE-trigger
De trigger zet de kolom op de huidige tijd als een rij verandert en de update hem niet instelde, zoals MySQL doet.
Rapportregel: on_update_trigger
generated columns
GENERATED ALWAYS AS, VIRTUAL of STORED zoals in de bron
SQLite 3.31 en later berekenen gegenereerde kolommen op dezelfde twee manieren.
generated columns with functions SQLite lacks
een gewone kolom
Een formule die niet voor SQLite kan worden geschreven, levert een gewone kolom en een regel in het rapport op.
Rapportregel: generated_not_translated
INVISIBLE columns
gewone kolommen
SQLite heeft geen onzichtbare kolommen.
Rapportregel: invisible_column
CHECK constraints
vertaald, inline in CREATE TABLE
SQLite accepteert checks alleen in CREATE TABLE.
CHECK constraints with functions SQLite lacks
niet aangemaakt
Een check die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld.
Rapportregel: check_skipped
CHECK ... NOT ENFORCED
niet aangemaakt
MySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden.
Rapportregel: check_not_enforced
defaults with functions SQLite lacks
geen standaardwaarde
Een standaardwaarde die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld.
Rapportregel: default_not_translated
keys and indexes on a prefix, c(20)
een index op substr(c, 1, 20)
SQLite indexeert expressies, dus hetzelfde prefix wordt geïndexeerd en een uniek prefix blijft uniek.
Rapportregel: prefix_unique
FULLTEXT indexes
niet aangemaakt
SQLite doorzoekt tekst met aparte FTS5-tabellen, die hun eigen query's nodig hebben.
Rapportregel: fulltext_not_created
SPATIAL indexes
niet aangemaakt
SQLite heeft geen ruimtelijke index op een kolom.
Rapportregel: spatial_index_not_created
functional indexes SQLite can't write
niet aangemaakt
Een index op een expressie die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld.
Rapportregel: index_skipped
foreign keys
in CREATE TABLE, ongecontroleerd geladen, daarna opgesomd door PRAGMA foreign_key_check
SQLite accepteert refererende sleutels alleen in CREATE TABLE en controleert ze alleen met PRAGMA foreign_keys aan. De rijen laden ongecontroleerd, zoals vanuit MySQL, en het script somt aan het einde elke rij zonder ouder op.
foreign keys to columns without a unique key
niet aangemaakt
SQLite heeft een unieke sleutel nodig op de kolommen waarnaar wordt verwezen; InnoDB niet.
Rapportregel: foreign_key_skipped
table, index and column names
zoals geschreven; hernoemd als ze alleen in hoofdletters verschillen of een indexnaam herhaald wordt
Namen in SQLite negeren hoofdletters, en indexnamen delen één naamruimte per database.
Rapportregel: identifier_renamed
GEOMETRY, POINT, POLYGON...
WKB in een BLOB
Het standaardformaat well-known binary behoudt elke geometrie exact.
Rapportregel: geometry_as_blob
INET4, INET6, UUID (MariaDB)
TEXT
SQLite heeft zulke typen niet; de tekst is die MariaDB teruggeeft.
BINARY, VARBINARY, BLOB
BLOB
Bytes blijven bytes.
PARTITION BY
één tabel
De rijen zijn dezelfde.
Rapportregel: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
een tabel met de huidige rijen
Een dump bevat alleen de huidige rijen.
Rapportregel: system_versioning_dropped
MyISAM, MEMORY and other engines
een gewone tabel
SQLite heeft één tabelengine.
Rapportregel: engine_dropped
dumps of several databases
één bestand, elke tabel met de naam van zijn database ervoor
Een SQLite-bestand is één database, dus de databasenaam houdt tabellen met dezelfde naam uit elkaar.
Rapportregel: databases_merged
views, triggers, procedures, functions and events
vermeld in het rapport
Hun code is geschreven in de taal van MySQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.
Rapportregel: not_converted_objects
dumps without CREATE TABLE
typen afgeleid uit de waarden
Een dump gemaakt met --no-create-info bevat alleen rijen, dus de typen komen uit de waarden.
Rapportregel: no_schema
geometries in a dump without CREATE TABLE
WKB in een BLOB
Het geometrieformaat van MySQL wordt herkend aan de waarden en opgeslagen als standaard-WKB.
Rapportregel: geometry_as_blob
_ci collations
exacte vergelijking
SQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters.
Rapportregel: case_insensitive_collation
SET NAMES utf8 from utf8mb4 tables
geconverteerd, met een waarschuwing
mysqldump van MySQL 5.x schrijft standaard 3-byte utf8 en vervangt elke emoji door een vraagteken voordat een converter het bestand ziet.
Rapportregel: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
gelezen als Latin-1 (Windows-1252)
latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps.
Rapportregel: charset_guessed
sjis, cp932, gbk, big5 dumps
gelezen als UTF-8, met een waarschuwing
Deze coderingen worden nog niet gedecodeerd.
Rapportregel: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
geëvalueerd
Sommige dumptools schrijven waarden als deze aanroepen; ze worden gelezen als de waarden die ze opleveren, met geografische WKT omgezet naar lengtegraad eerst.
other expressions in rows
NULL
Een converter die geen database draait, kan ze niet evalueren.
Rapportregel: expression_value
DEFAULT in VALUES
de standaardwaarde van de kolom
Een letterlijke standaardwaarde wordt in de rij gekopieerd.
Rapportregel: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Er is geen waarde om te kopiëren.
Rapportregel: default_keyword_null
REPLACE and INSERT IGNORE
gewone rijen
Een dump heeft één rij per sleutel, dus de rijen zijn dezelfde.
Rapportregel: replace_as_insert
types IntoSQL doesn't know
TEXT
Tekst kan elke waarde bevatten; wijzig het type na het laden.
Rapportregel: unknown_type
values that don't fit their column
NULL
Een beschadigde of met de hand geschreven dump kan waarden bevatten die de kolom niet aankan; ze worden NULL zodat de rest laadt.
Rapportregel: invalid_value_null
unreadable geometries
NULL
Bytes die geen geometrie zijn, kunnen niet als geometrie worden opgeslagen.
Rapportregel: bad_geometry
CREATE SEQUENCE (MariaDB)
niet aangemaakt
SQLite heeft geen sequences.
Rapportregel: sequence_not_converted
VECTOR(n) (MariaDB 11.7+)
TEXT met de floats als JSON-array
SQLite heeft geen vectortype; een JSON-array behoudt elke float.
Rapportregel: type_replaced
| In MySQL | In SQLite | Rapportregel |
|---|---|---|
| TINYINT(1), BOOL | INTEGER met de waarden ongewijzigdSQLite heeft geen boolean-type; true en false zijn de gehele getallen 1 en 0, dus elke waarde behoudt zijn betekenis. | |
| UNSIGNED integers | INTEGER met een CHECK dat het niet negatief is; BIGINT UNSIGNED met waarden boven 2^63-1 wordt TEXTGehele getallen in SQLite zijn 64-bits en signed. De check houdt negatieve waarden buiten, zoals MySQL deed; waarden buiten het signed bereik blijven tekst, zodat geen cijfer verloren gaat. | unsigned_widened |
| ZEROFILL and display widths | weggelatenOpvulling met nullen is een manier om een getal te tonen, geen deel ervan. De getallen blijven; formatteer ze bij het lezen als de opvulling ertoe doet. | zerofill_dropped |
| FLOAT(M,D) | REAL, zonder de schaalDrijvendekommagetallen in SQLite hebben geen vaste schaal. De opgeslagen waarden worden ongewijzigd gekopieerd. | float_scale_dropped |
| DECIMAL(p,s) | DECIMAL(p,s) tot 15 cijfers; daarboven TEXTSQLite bewaart ongeveer 15 significante cijfers in een getal. Bredere decimalen blijven tekst, zodat elk cijfer exact blijft. | decimal_as_text |
| BIT(1), BIT(n) | INTEGER met de waarde van de bits; BIT(64) als TEXT-cijfersEen bitveld wordt opgeslagen als het getal dat zijn bits vormen. De hoogste bit van een BIT(64) past niet in een signed geheel getal, dus dat getal blijft tekst. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLDe datumfuncties van SQLite lezen alleen echte kalenderdatums. Ze worden NULL en het rapport telt ze, zoals bij elke andere database. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen. | not_null_relaxed |
| DEFAULT '0000-00-00' | geen standaardwaardeEen standaardwaarde die geen echte datum is, wordt weggelaten in plaats van vervangen door een verzonnen datum. | zero_date_default |
| TIME | TIME-tekst zoals MySQL hem schrijft, inclusief durenSQLite bewaart tijden als tekst, dus duren van meer dan een dag of onder nul blijven exact. | |
| YEAR | INTEGER met een CHECK op het bereikSQLite heeft geen jaartype; de check houdt dezelfde waarden die MySQL toestaat. | |
| CHAR(n), VARCHAR(n) | VARCHAR(n), niet afgedwongenSQLite bewaart het gedeclareerde type zodat tools het kunnen lezen, maar beperkt de lengte niet; de waarden zijn die MySQL teruggeeft. | |
| DATETIME | DATETIME als ISO 8601-tekstSQLite slaat datums op als tekst die zijn datumfuncties lezen. | |
| TIMESTAMP | TIMESTAMP als ISO 8601-tekst in UTC; de zone die de dump vermeldt, UTC als die er geen vermeldtEen TIMESTAMP is een moment, geschreven in UTC. Dumps vermelden de zone waarin ze het schreven (mysqldump schrijft UTC); zonder die vermelding worden de waarden gelezen als UTC en meldt het rapport dat. | timestamp_zone_assumed |
| ENUM | TEXT met een CHECK op de waardenTekst met een check houdt dezelfde waarden. | |
| ENUM holding '' (MySQL's error value) | de lege waarde, toegestaan door de checkMySQL slaat een lege string op als er in een tolerante SQL-modus een ongeldige waarde in een ENUM komt. Die rijen blijven behouden en de check staat ze toe. | enum_invalid_value |
| ENUM holding values outside its list | geen CHECKWaarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt. | enum_check_skipped |
| SET | TEXT zoals MySQL het schrijft ('a,b')SQLite heeft geen arrays; de tekst is die MySQL teruggeeft. | |
| JSON | TEXTDe JSON-functies van SQLite lezen JSON uit tekst. Een kolom gedeclareerd als JSON zou "123" in een getal veranderen, dus het is TEXT. | |
| NUL bytes in text | behoudenTekst in SQLite kan een NUL-byte bevatten, dus de waarde wordt ongewijzigd gekopieerd. | |
| text that isn't valid in its character set | de foute bytes als het vervangingstekenTekst in SQLite is UTF-8; zijn functies lezen bytes die dat niet zijn verkeerd. | invalid_utf8_replaced |
| text decoded twice (ñ) | ongewijzigd gekopieerdDe dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan. | mojibake_suspected |
| AUTO_INCREMENT | INTEGER PRIMARY KEY AUTOINCREMENT, met de teller voorbij de gekopieerde id'sSQLite telt een hele primaire sleutel van gehele getallen. AUTOINCREMENT voorkomt dat id's opnieuw worden gebruikt, zoals MySQL doet, en de teller gaat verder na het hoogste id of de AUTO_INCREMENT van de dump, welke hoger is. | |
| AUTO_INCREMENT on part of a key or outside one | INTEGER zonder tellerSQLite telt alleen een kolom die de hele primaire sleutel is, dus de kolom behoudt zijn waarden en nieuwe rijen hebben hun eigen waarden nodig. | identity_without_counter |
| ON UPDATE CURRENT_TIMESTAMP | een AFTER UPDATE-triggerDe trigger zet de kolom op de huidige tijd als een rij verandert en de update hem niet instelde, zoals MySQL doet. | on_update_trigger |
| generated columns | GENERATED ALWAYS AS, VIRTUAL of STORED zoals in de bronSQLite 3.31 en later berekenen gegenereerde kolommen op dezelfde twee manieren. | |
| generated columns with functions SQLite lacks | een gewone kolomEen formule die niet voor SQLite kan worden geschreven, levert een gewone kolom en een regel in het rapport op. | generated_not_translated |
| INVISIBLE columns | gewone kolommenSQLite heeft geen onzichtbare kolommen. | invisible_column |
| CHECK constraints | vertaald, inline in CREATE TABLESQLite accepteert checks alleen in CREATE TABLE. | |
| CHECK constraints with functions SQLite lacks | niet aangemaaktEen check die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld. | check_skipped |
| CHECK ... NOT ENFORCED | niet aangemaaktMySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden. | check_not_enforced |
| defaults with functions SQLite lacks | geen standaardwaardeEen standaardwaarde die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld. | default_not_translated |
| keys and indexes on a prefix, c(20) | een index op substr(c, 1, 20)SQLite indexeert expressies, dus hetzelfde prefix wordt geïndexeerd en een uniek prefix blijft uniek. | prefix_unique |
| FULLTEXT indexes | niet aangemaaktSQLite doorzoekt tekst met aparte FTS5-tabellen, die hun eigen query's nodig hebben. | fulltext_not_created |
| SPATIAL indexes | niet aangemaaktSQLite heeft geen ruimtelijke index op een kolom. | spatial_index_not_created |
| functional indexes SQLite can't write | niet aangemaaktEen index op een expressie die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld. | index_skipped |
| foreign keys | in CREATE TABLE, ongecontroleerd geladen, daarna opgesomd door PRAGMA foreign_key_checkSQLite accepteert refererende sleutels alleen in CREATE TABLE en controleert ze alleen met PRAGMA foreign_keys aan. De rijen laden ongecontroleerd, zoals vanuit MySQL, en het script somt aan het einde elke rij zonder ouder op. | |
| foreign keys to columns without a unique key | niet aangemaaktSQLite heeft een unieke sleutel nodig op de kolommen waarnaar wordt verwezen; InnoDB niet. | foreign_key_skipped |
| table, index and column names | zoals geschreven; hernoemd als ze alleen in hoofdletters verschillen of een indexnaam herhaald wordtNamen in SQLite negeren hoofdletters, en indexnamen delen één naamruimte per database. | identifier_renamed |
| GEOMETRY, POINT, POLYGON... | WKB in een BLOBHet standaardformaat well-known binary behoudt elke geometrie exact. | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | TEXTSQLite heeft zulke typen niet; de tekst is die MariaDB teruggeeft. | |
| BINARY, VARBINARY, BLOB | BLOBBytes blijven bytes. | |
| PARTITION BY | één tabelDe rijen zijn dezelfde. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | een tabel met de huidige rijenEen dump bevat alleen de huidige rijen. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | een gewone tabelSQLite heeft één tabelengine. | engine_dropped |
| dumps of several databases | één bestand, elke tabel met de naam van zijn database ervoorEen SQLite-bestand is één database, dus de databasenaam houdt tabellen met dezelfde naam uit elkaar. | databases_merged |
| views, triggers, procedures, functions and events | vermeld in het rapportHun code is geschreven in de taal van MySQL, dus ze worden vermeld zodat je ze opnieuw kunt maken. | not_converted_objects |
| dumps without CREATE TABLE | typen afgeleid uit de waardenEen dump gemaakt met --no-create-info bevat alleen rijen, dus de typen komen uit de waarden. | no_schema |
| geometries in a dump without CREATE TABLE | WKB in een BLOBHet geometrieformaat van MySQL wordt herkend aan de waarden en opgeslagen als standaard-WKB. | geometry_as_blob |
| _ci collations | exacte vergelijkingSQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | geconverteerd, met een waarschuwingmysqldump van MySQL 5.x schrijft standaard 3-byte utf8 en vervangt elke emoji door een vraagteken voordat een converter het bestand ziet. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | gelezen als Latin-1 (Windows-1252)latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | gelezen als UTF-8, met een waarschuwingDeze coderingen worden nog niet gedecodeerd. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | geëvalueerdSommige dumptools schrijven waarden als deze aanroepen; ze worden gelezen als de waarden die ze opleveren, met geografische WKT omgezet naar lengtegraad eerst. | |
| other expressions in rows | NULLEen converter die geen database draait, kan ze niet evalueren. | expression_value |
| DEFAULT in VALUES | de standaardwaarde van de kolomEen letterlijke standaardwaarde wordt in de rij gekopieerd. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLEr is geen waarde om te kopiëren. | default_keyword_null |
| REPLACE and INSERT IGNORE | gewone rijenEen dump heeft één rij per sleutel, dus de rijen zijn dezelfde. | replace_as_insert |
| types IntoSQL doesn't know | TEXTTekst kan elke waarde bevatten; wijzig het type na het laden. | unknown_type |
| values that don't fit their column | NULLEen beschadigde of met de hand geschreven dump kan waarden bevatten die de kolom niet aankan; ze worden NULL zodat de rest laadt. | invalid_value_null |
| unreadable geometries | NULLBytes die geen geometrie zijn, kunnen niet als geometrie worden opgeslagen. | bad_geometry |
| CREATE SEQUENCE (MariaDB) | niet aangemaaktSQLite heeft geen sequences. | sequence_not_converted |
| VECTOR(n) (MariaDB 11.7+) | TEXT met de floats als JSON-arraySQLite heeft geen vectortype; een JSON-array behoudt elke float. | type_replaced |
Het script in SQLite laden
Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.
sqlite3 -bail mydb.sqlite < mysql.sqlite.sqlRefererende sleutels worden in elke tabel gedeclareerd en de rijen laden met de controle op refererende sleutels uit. Daarna somt het script elke rij op die naar een niet-bestaande rij verwijst, in plaats van halverwege te mislukken.
Laad een grote dump in een nieuw bestand op een lokale schijf. Het script laadt alles in één transactie met synchronisatie uit, dus het draait op schijfsnelheid, en een laadactie die halverwege stopt, laat geen halve tabellen achter.
De opdrachtregel laadt het bestand rechtstreeks in een SQLite-database, zonder een script te schrijven. Dat is gratis.
Een dump van MySQL maken voor het beste resultaat
De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:
- --default-character-set=utf8mb4 behoudt emoji en andere 4-bytestekens, die een utf8-dump kwijtraakt voordat de converter hem ziet.
- --hex-blob schrijft binaire kolommen als hexadecimaal, wat kopiëren tussen systemen overleeft.
- --routines --triggers --events voegen die objecten aan de dump toe, zodat het rapport ze kan vermelden.
Wat niet wordt geconverteerd
Weergaven, triggers, opgeslagen procedures, functies en gebeurtenissen worden geschreven in de eigen taal van elke database. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQLite.
Vragen over MySQL naar SQLite
Staat je vraag er niet bij? Schrijf ons via de contactpagina en een mens antwoordt. Contactpagina
Wordt mijn dump geüpload?
Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.
Hoe groot mag de dump zijn?
De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.
Leest het MariaDB-dumps?
Ja. Dumps van mariadb-dump en van MariaDB 10.3 tot en met 12 worden op dezelfde manier geconverteerd, inclusief de INET6-, INET4- en UUID-kolommen van MariaDB.
Wat gebeurt er met datums als 0000-00-00?
Ze worden NULL: SQLite zou de tekst opslaan, maar niets leest 0000-00-00 als datum. Het rapport vermeldt hoeveel er in elke kolom waren.
Blijven AUTO_INCREMENT-waarden behouden?
Ja. Een AUTO_INCREMENT-kolom die de hele primaire sleutel van de tabel is, wordt INTEGER PRIMARY KEY AUTOINCREMENT, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste. Elke andere AUTO_INCREMENT-kolom behoudt zijn waarden zonder teller, en het rapport meldt dat.
Wordt TINYINT(1) boolean?
Nee. SQLite heeft geen boolean-type, dus TINYINT(1) wordt INTEGER en elke waarde blijft ongewijzigd.
En opgeslagen procedures en triggers?
Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft. ON UPDATE CURRENT_TIMESTAMP is de uitzondering: dat wordt een SQLite-trigger.
Op welke SQLite-versies laadt het script?
SQLite 3.31 en later. Elke testdump laadt op 3.31 en 3.54 en stopt bij de eerste fout als er iets misgaat.