Naar de inhoud
IntoSQL-startpagina

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.

Je bestand
sqlshop_2024.sqlVoorbeeldbestand, 5,1 kB
Je database

18 rijen geconverteerd, 8 correcties, geen afgewezen

Tonen

Tabellen in shop_2024.sqlMySQL 8.0.46-dump · geschreven door mysqldump · utf8mb4

  • customers8 rijen3
    7 kolommen
    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
  • orders10 rijen5
    9 kolommen
    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)
    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,
    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

  1. "id" van customers is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
  2. "signed_up" van customers staat nu NULL toe: sommige waarden konden niet worden opgeslagen en zijn NULL.
  3. De standaardwaarde van "signed_up" in customers, 0000‑00‑00, is geen datum die SQLite accepteert, dus de kolom heeft geen standaardwaarde.
  4. "customer_id" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
  5. "id" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
  6. "items" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
  7. 1 rij van "status" in orders bevat de lege waarde die MySQL opslaat voor ongeldige invoer; de check op de waarden staat die toe.
  8. "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 MySQLIn SQLiteRapportregel
TINYINT(1), BOOLINTEGER 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 integersINTEGER 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 widthsweggelatenOpvulling 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 NULLNOT 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
TIMETIME-tekst zoals MySQL hem schrijft, inclusief durenSQLite bewaart tijden als tekst, dus duren van meer dan een dag of onder nul blijven exact.
YEARINTEGER 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.
DATETIMEDATETIME als ISO 8601-tekstSQLite slaat datums op als tekst die zijn datumfuncties lezen.
TIMESTAMPTIMESTAMP 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
ENUMTEXT 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 listgeen CHECKWaarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt.enum_check_skipped
SETTEXT zoals MySQL het schrijft ('a,b')SQLite heeft geen arrays; de tekst is die MySQL teruggeeft.
JSONTEXTDe 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 textbehoudenTekst in SQLite kan een NUL-byte bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its character setde 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_INCREMENTINTEGER 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 oneINTEGER 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_TIMESTAMPeen 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 columnsGENERATED 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 lackseen 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 columnsgewone kolommenSQLite heeft geen onzichtbare kolommen.invisible_column
CHECK constraintsvertaald, inline in CREATE TABLESQLite accepteert checks alleen in CREATE TABLE.
CHECK constraints with functions SQLite lacksniet aangemaaktEen check die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK ... NOT ENFORCEDniet aangemaaktMySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden.check_not_enforced
defaults with functions SQLite lacksgeen 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 indexesniet aangemaaktSQLite doorzoekt tekst met aparte FTS5-tabellen, die hun eigen query's nodig hebben.fulltext_not_created
SPATIAL indexesniet aangemaaktSQLite heeft geen ruimtelijke index op een kolom.spatial_index_not_created
functional indexes SQLite can't writeniet aangemaaktEen index op een expressie die niet voor SQLite kan worden geschreven, wordt weggelaten en gemeld.index_skipped
foreign keysin 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 keyniet aangemaaktSQLite heeft een unieke sleutel nodig op de kolommen waarnaar wordt verwezen; InnoDB niet.foreign_key_skipped
table, index and column nameszoals 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, BLOBBLOBBytes 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 engineseen 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 eventsvermeld 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 TABLEtypen 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 TABLEWKB in een BLOBHet geometrieformaat van MySQL wordt herkend aan de waarden en opgeslagen als standaard-WKB.geometry_as_blob
_ci collationsexacte vergelijkingSQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesgeconverteerd, 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-8gelezen als Latin-1 (Windows-1252)latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps.charset_guessed
sjis, cp932, gbk, big5 dumpsgelezen als UTF-8, met een waarschuwingDeze coderingen worden nog niet gedecodeerd.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsgeë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 rowsNULLEen converter die geen database draait, kan ze niet evalueren.expression_value
DEFAULT in VALUESde standaardwaarde van de kolomEen letterlijke standaardwaarde wordt in de rij gekopieerd.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLEr is geen waarde om te kopiëren.default_keyword_null
REPLACE and INSERT IGNOREgewone rijenEen dump heeft één rij per sleutel, dus de rijen zijn dezelfde.replace_as_insert
types IntoSQL doesn't knowTEXTTekst kan elke waarde bevatten; wijzig het type na het laden.unknown_type
values that don't fit their columnNULLEen 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 geometriesNULLBytes 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.sql

Refererende 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.