Przejdź do treści
Strona główna IntoSQL

Konwertuj MariaDB do SQLite

Upuść zrzut z mariadb-dump, mysqldump, phpMyAdmin lub Adminer jako .sql lub .sql.gz i pobierz skrypt SQLite z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której SQLite nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.

Twój plik
sqlshop_2024_mariadb.sqlPlik przykładowy, 6,6 kB
Twoja baza danych

18 wierszy przekonwertowanych, 8 poprawek, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_mariadb.sqlZrzut MariaDB 11.8.9-MariaDB-ubu2404 · zapisany przez mariadb-dump · utf8mb4

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

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

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

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

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

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

Poprawki

  1. "id" w tabeli customers jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
  2. "signed_up" w tabeli customers dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
  3. Wartość domyślna "signed_up" w tabeli customers, 0000‑00‑00, nie jest datą akceptowaną przez SQLite, więc kolumna nie ma wartości domyślnej.
  4. "customer_id" w tabeli orders jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
  5. "id" w tabeli orders jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
  6. "items" w tabeli orders jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
  7. W "status" tabeli orders 1 wiersz zawiera pustą wartość, którą MySQL zapisuje dla błędnych danych; ograniczenie CHECK kolumny ją dopuszcza.
  8. "updated_at" w tabeli orders zmienia się na bieżący czas przy każdej aktualizacji; w SQLite robi to wyzwalacz.

Do sprawdzenia

  • Pominięto 1 sekwencję; SQLite nie ma sekwencji. Przechowuj następną wartość w tabeli, jeśli twoja aplikacja jej potrzebuje.
  • W "signed_up" tabeli customers zamieniono na NULL 1 wartość z zerową lub niemożliwą datą, np. 0000‑00‑00, bo SQLite nie zapisuje takich dat. Jeśli te daty coś znaczą, zastąp je w źródle prawdziwymi, zanim zrobisz zrzut.
  • Wartości domyślnej "invoice" w tabeli orders nie da się zapisać dla SQLite (a sequence), więc kolumna nie ma wartości domyślnej. Dodaj wartość domyślną ręcznie, jeśli nowe wiersze jej potrzebują.
  • W "shipped_at" tabeli orders zamieniono na NULL 1 wartość z zerową lub niemożliwą datą, np. 0000‑00‑00 00:00:00, bo SQLite nie zapisuje takich dat. Jeśli te daty coś znaczą, zastąp je w źródle prawdziwymi, zanim zrobisz zrzut.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co zmienia się między MariaDB a SQLite

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

  • TINYINT(1), BOOL

    INTEGER z wartościami bez zmian

    SQLite nie ma typu logicznego; true i false to liczby całkowite 1 i 0, więc każda wartość zachowuje znaczenie.

  • UNSIGNED integers

    INTEGER z CHECK, że wartość nie jest ujemna; BIGINT UNSIGNED z wartościami powyżej 2^63-1 to TEXT

    Liczby całkowite w SQLite są 64-bitowe ze znakiem. Ograniczenie CHECK blokuje wartości ujemne, tak jak MySQL; wartości spoza zakresu ze znakiem są zapisywane jako tekst, więc żadna cyfra nie ginie.

    Wpis w raporcie: unsigned_widened

  • ZEROFILL and display widths

    usunięte

    Dopełnienie zerami to sposób wyświetlania liczby, a nie jej część. Liczby zostają zachowane; jeśli dopełnienie jest ważne, formatuj je przy odczycie.

    Wpis w raporcie: zerofill_dropped

  • FLOAT(M,D)

    REAL, bez skali

    Liczby zmiennoprzecinkowe w SQLite nie mają stałej skali. Zapisane wartości są kopiowane bez zmian.

    Wpis w raporcie: float_scale_dropped

  • DECIMAL(p,s)

    DECIMAL(p,s) do 15 cyfr; powyżej TEXT

    SQLite przechowuje w liczbie około 15 cyfr znaczących. Szersze liczby dziesiętne są zapisywane jako tekst, aby każda cyfra pozostała dokładna.

    Wpis w raporcie: decimal_as_text

  • BIT(1), BIT(n)

    INTEGER z wartością bitów; BIT(64) jako cyfry w TEXT

    Pole bitowe jest zapisywane jako liczba, którą tworzą jego bity. Najwyższy bit BIT(64) nie mieści się w liczbie całkowitej ze znakiem, więc jego liczba jest zapisywana jako tekst.

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

    NULL

    Funkcje dat w SQLite odczytują tylko prawdziwe daty kalendarzowe. Stają się NULL, a raport je liczy, tak jak dla każdej innej bazy danych.

    Wpis w raporcie: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL usunięte

    Kolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

  • DEFAULT '0000-00-00'

    brak wartości domyślnej

    Wartość domyślna, która nie jest prawdziwą datą, jest pomijana, a nie zastępowana zmyśloną.

    Wpis w raporcie: zero_date_default

  • TIME

    TIME jako tekst w zapisie MySQL, łącznie z czasami trwania

    SQLite przechowuje czas jako tekst, więc czasy trwania dłuższe niż doba lub ujemne są zachowywane dokładnie.

  • YEAR

    INTEGER z CHECK zakresu

    SQLite nie ma typu roku; ograniczenie CHECK zachowuje te same wartości, na które pozwala MySQL.

  • CHAR(n), VARCHAR(n)

    VARCHAR(n), bez wymuszania

    SQLite zachowuje zadeklarowany typ dla narzędzi, ale nie ogranicza długości; wartości są takie, jakie zwraca MySQL.

  • DATETIME

    DATETIME jako tekst ISO 8601

    SQLite przechowuje daty jako tekst, który czytają jego funkcje dat.

  • TIMESTAMP

    TIMESTAMP jako tekst ISO 8601 w UTC; strefa podana w zrzucie, UTC, gdy jej nie podaje

    TIMESTAMP to moment w czasie, zapisany w UTC. Zrzuty podają strefę, w której go zapisały (mysqldump zapisuje UTC); bez niej wartości są odczytywane jako UTC, a raport o tym mówi.

    Wpis w raporcie: timestamp_zone_assumed

  • ENUM

    TEXT z CHECK dozwolonych wartości

    Tekst z ograniczeniem CHECK zachowuje te same wartości.

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

    pusta wartość dopuszczona przez CHECK

    MySQL zapisuje pusty ciąg, gdy w łagodnym trybie SQL do ENUM trafia błędna wartość. Te wiersze są zachowywane, a ograniczenie CHECK je dopuszcza.

    Wpis w raporcie: enum_invalid_value

  • ENUM holding values outside its list

    bez CHECK

    Wartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.

    Wpis w raporcie: enum_check_skipped

  • SET

    TEXT w zapisie MySQL ('a,b')

    SQLite nie ma tablic; tekst jest taki, jaki zwraca MySQL.

  • JSON

    TEXT

    Funkcje JSON w SQLite odczytują JSON z tekstu. Kolumna zadeklarowana jako JSON zamieniłaby "123" na liczbę, więc jest TEXT.

  • NUL bytes in text

    zachowane

    Tekst w SQLite może zawierać bajt NUL, więc wartość jest kopiowana bez zmian.

  • text that isn't valid in its character set

    błędne bajty jako znak zastępczy

    Tekst w SQLite to UTF-8; jego funkcje błędnie odczytują bajty, które nim nie są.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Zrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

  • AUTO_INCREMENT

    INTEGER PRIMARY KEY AUTOINCREMENT, z licznikiem ustawionym za skopiowanymi id

    SQLite liczy cały całkowity klucz główny. AUTOINCREMENT nie pozwala ponownie użyć id, tak jak MySQL, a licznik idzie dalej od najwyższego id lub od AUTO_INCREMENT ze zrzutu, zależnie od tego, która wartość jest wyższa.

  • AUTO_INCREMENT on part of a key or outside one

    INTEGER bez licznika

    SQLite liczy tylko kolumnę, która jest całym kluczem głównym, więc kolumna zachowuje swoje wartości, a nowe wiersze potrzebują własnych.

    Wpis w raporcie: identity_without_counter

  • ON UPDATE CURRENT_TIMESTAMP

    wyzwalacz AFTER UPDATE

    Wyzwalacz ustawia kolumnę na bieżący czas, gdy wiersz się zmienia, a aktualizacja jej nie ustawiła, tak jak MySQL.

    Wpis w raporcie: on_update_trigger

  • generated columns

    GENERATED ALWAYS AS, VIRTUAL lub STORED jak w źródle

    SQLite 3.31 i nowsze obliczają kolumny generowane na te same dwa sposoby.

  • generated columns with functions SQLite lacks

    zwykła kolumna

    Formuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę i wpis w raporcie.

    Wpis w raporcie: generated_not_translated

  • INVISIBLE columns

    zwykłe kolumny

    SQLite nie ma niewidocznych kolumn.

    Wpis w raporcie: invisible_column

  • CHECK constraints

    przetłumaczone, wewnątrz CREATE TABLE

    SQLite przyjmuje ograniczenia CHECK tylko w CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać dla SQLite, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • CHECK ... NOT ENFORCED

    nie jest tworzone

    MySQL przechowuje te ograniczenia bez ich stosowania, więc wiersze mogą je łamać.

    Wpis w raporcie: check_not_enforced

  • defaults with functions SQLite lacks

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać dla SQLite, jest pomijana i zgłaszana w raporcie.

    Wpis w raporcie: default_not_translated

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

    indeks na substr(c, 1, 20)

    SQLite indeksuje wyrażenia, więc indeksowany jest ten sam prefiks, a unikalny prefiks pozostaje unikalny.

    Wpis w raporcie: prefix_unique

  • FULLTEXT indexes

    nie jest tworzone

    SQLite przeszukuje tekst za pomocą osobnych tabel FTS5, które wymagają własnych zapytań.

    Wpis w raporcie: fulltext_not_created

  • SPATIAL indexes

    nie jest tworzone

    SQLite nie ma indeksu przestrzennego na kolumnie.

    Wpis w raporcie: spatial_index_not_created

  • functional indexes SQLite can't write

    nie jest tworzony

    Indeks na wyrażeniu, którego nie da się zapisać dla SQLite, jest pomijany i zgłaszany w raporcie.

    Wpis w raporcie: index_skipped

  • foreign keys

    w CREATE TABLE, ładowane bez sprawdzania, potem wypisywane przez PRAGMA foreign_key_check

    SQLite przyjmuje klucze obce tylko w CREATE TABLE i sprawdza je tylko z włączonym PRAGMA foreign_keys. Wiersze ładują się bez sprawdzania, jak z MySQL, a na końcu skrypt wypisuje każdy wiersz bez rodzica.

  • foreign keys to columns without a unique key

    nie jest tworzony

    SQLite wymaga klucza unikalnego na kolumnach, do których się odwołuje; InnoDB nie.

    Wpis w raporcie: foreign_key_skipped

  • table, index and column names

    jak w źródle; zmienione, gdy różnią się tylko wielkością liter lub nazwa indeksu się powtarza

    Nazwy w SQLite ignorują wielkość liter, a nazwy indeksów dzielą jedną przestrzeń nazw w bazie danych.

    Wpis w raporcie: identifier_renamed

  • GEOMETRY, POINT, POLYGON...

    WKB w BLOB

    Standardowy format well-known binary zachowuje dokładnie każdą geometrię.

    Wpis w raporcie: geometry_as_blob

  • INET4, INET6, UUID (MariaDB)

    TEXT

    SQLite nie ma takich typów; tekst jest taki, jaki zwraca MariaDB.

  • BINARY, VARBINARY, BLOB

    BLOB

    Bajty pozostają bajtami.

  • PARTITION BY

    jedna tabela

    Wiersze są te same.

    Wpis w raporcie: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    tabela z bieżącymi wierszami

    Zrzut zawiera tylko bieżące wiersze.

    Wpis w raporcie: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    zwykła tabela

    SQLite ma jeden silnik tabel.

    Wpis w raporcie: engine_dropped

  • dumps of several databases

    jeden plik, nazwa każdej tabeli zaczyna się od nazwy jej bazy

    Plik SQLite to jedna baza danych, więc nazwa bazy odróżnia tabele o tej samej nazwie.

    Wpis w raporcie: databases_merged

  • views, triggers, procedures, functions and events

    wymienione w raporcie

    Ich kod jest napisany w języku MySQL, więc trafiają na listę do ręcznego odtworzenia.

    Wpis w raporcie: not_converted_objects

  • dumps without CREATE TABLE

    typy odczytane z wartości

    Zrzut zrobiony z --no-create-info zawiera tylko wiersze, więc typy pochodzą z wartości.

    Wpis w raporcie: no_schema

  • geometries in a dump without CREATE TABLE

    WKB w BLOB

    Format geometrii MySQL jest rozpoznawany po wartościach i zapisywany jako standardowe WKB.

    Wpis w raporcie: geometry_as_blob

  • _ci collations

    dokładne porównanie

    SQLite porównuje tekst dokładnie, chyba że ustawisz inaczej, a jego NOCASE ujednolica tylko litery ASCII.

    Wpis w raporcie: case_insensitive_collation

  • SET NAMES utf8 from utf8mb4 tables

    przekonwertowane, z ostrzeżeniem

    mysqldump z MySQL 5.x domyślnie zapisuje 3-bajtowe utf8 i zastępuje każde emoji znakiem zapytania, zanim jakikolwiek konwerter zobaczy plik.

    Wpis w raporcie: dump_lost_four_byte_chars

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

    odczytane jako Latin-1 (Windows-1252)

    latin1 w MySQL to Windows-1252, zwykłe kodowanie takich zrzutów.

    Wpis w raporcie: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    odczytane jako UTF-8, z ostrzeżeniem

    Te kodowania nie są jeszcze dekodowane.

    Wpis w raporcie: unsupported_charset

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

    obliczone

    Niektóre narzędzia do zrzutów zapisują wartości jako takie wywołania; są odczytywane jako wartości, które zwracają, przy czym w geograficznym WKT najpierw jest długość geograficzna.

  • other expressions in rows

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć.

    Wpis w raporcie: expression_value

  • DEFAULT in VALUES

    wartość domyślna kolumny

    Dosłowna wartość domyślna jest kopiowana do wiersza.

    Wpis w raporcie: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Nie ma wartości do skopiowania.

    Wpis w raporcie: default_keyword_null

  • REPLACE and INSERT IGNORE

    zwykłe wiersze

    Zrzut ma jeden wiersz na klucz, więc wiersze są te same.

    Wpis w raporcie: replace_as_insert

  • types IntoSQL doesn't know

    TEXT

    Tekst mieści każdą wartość; zmień typ po załadowaniu.

    Wpis w raporcie: unknown_type

  • values that don't fit their column

    NULL

    Uszkodzony lub ręcznie pisany zrzut może zawierać wartości, których kolumna nie przyjmie; stają się NULL, aby reszta się załadowała.

    Wpis w raporcie: invalid_value_null

  • unreadable geometries

    NULL

    Bajtów, które nie są geometrią, nie da się zapisać jako geometrii.

    Wpis w raporcie: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    nie jest tworzone

    SQLite nie ma sekwencji.

    Wpis w raporcie: sequence_not_converted

  • VECTOR(n) (MariaDB 11.7+)

    TEXT z liczbami float jako tablicą JSON

    SQLite nie ma typu wektorowego; tablica JSON zachowuje każdą liczbę float.

    Wpis w raporcie: type_replaced

W MariaDBW SQLiteWpis w raporcie
TINYINT(1), BOOLINTEGER z wartościami bez zmianSQLite nie ma typu logicznego; true i false to liczby całkowite 1 i 0, więc każda wartość zachowuje znaczenie.
UNSIGNED integersINTEGER z CHECK, że wartość nie jest ujemna; BIGINT UNSIGNED z wartościami powyżej 2^63-1 to TEXTLiczby całkowite w SQLite są 64-bitowe ze znakiem. Ograniczenie CHECK blokuje wartości ujemne, tak jak MySQL; wartości spoza zakresu ze znakiem są zapisywane jako tekst, więc żadna cyfra nie ginie.unsigned_widened
ZEROFILL and display widthsusunięteDopełnienie zerami to sposób wyświetlania liczby, a nie jej część. Liczby zostają zachowane; jeśli dopełnienie jest ważne, formatuj je przy odczycie.zerofill_dropped
FLOAT(M,D)REAL, bez skaliLiczby zmiennoprzecinkowe w SQLite nie mają stałej skali. Zapisane wartości są kopiowane bez zmian.float_scale_dropped
DECIMAL(p,s)DECIMAL(p,s) do 15 cyfr; powyżej TEXTSQLite przechowuje w liczbie około 15 cyfr znaczących. Szersze liczby dziesiętne są zapisywane jako tekst, aby każda cyfra pozostała dokładna.decimal_as_text
BIT(1), BIT(n)INTEGER z wartością bitów; BIT(64) jako cyfry w TEXTPole bitowe jest zapisywane jako liczba, którą tworzą jego bity. Najwyższy bit BIT(64) nie mieści się w liczbie całkowitej ze znakiem, więc jego liczba jest zapisywana jako tekst.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLFunkcje dat w SQLite odczytują tylko prawdziwe daty kalendarzowe. Stają się NULL, a raport je liczy, tak jak dla każdej innej bazy danych.invalid_date_null
NOT NULL columns with values that become NULLNOT NULL usunięteKolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
DEFAULT '0000-00-00'brak wartości domyślnejWartość domyślna, która nie jest prawdziwą datą, jest pomijana, a nie zastępowana zmyśloną.zero_date_default
TIMETIME jako tekst w zapisie MySQL, łącznie z czasami trwaniaSQLite przechowuje czas jako tekst, więc czasy trwania dłuższe niż doba lub ujemne są zachowywane dokładnie.
YEARINTEGER z CHECK zakresuSQLite nie ma typu roku; ograniczenie CHECK zachowuje te same wartości, na które pozwala MySQL.
CHAR(n), VARCHAR(n)VARCHAR(n), bez wymuszaniaSQLite zachowuje zadeklarowany typ dla narzędzi, ale nie ogranicza długości; wartości są takie, jakie zwraca MySQL.
DATETIMEDATETIME jako tekst ISO 8601SQLite przechowuje daty jako tekst, który czytają jego funkcje dat.
TIMESTAMPTIMESTAMP jako tekst ISO 8601 w UTC; strefa podana w zrzucie, UTC, gdy jej nie podajeTIMESTAMP to moment w czasie, zapisany w UTC. Zrzuty podają strefę, w której go zapisały (mysqldump zapisuje UTC); bez niej wartości są odczytywane jako UTC, a raport o tym mówi.timestamp_zone_assumed
ENUMTEXT z CHECK dozwolonych wartościTekst z ograniczeniem CHECK zachowuje te same wartości.
ENUM holding '' (MySQL's error value)pusta wartość dopuszczona przez CHECKMySQL zapisuje pusty ciąg, gdy w łagodnym trybie SQL do ENUM trafia błędna wartość. Te wiersze są zachowywane, a ograniczenie CHECK je dopuszcza.enum_invalid_value
ENUM holding values outside its listbez CHECKWartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.enum_check_skipped
SETTEXT w zapisie MySQL ('a,b')SQLite nie ma tablic; tekst jest taki, jaki zwraca MySQL.
JSONTEXTFunkcje JSON w SQLite odczytują JSON z tekstu. Kolumna zadeklarowana jako JSON zamieniłaby "123" na liczbę, więc jest TEXT.
NUL bytes in textzachowaneTekst w SQLite może zawierać bajt NUL, więc wartość jest kopiowana bez zmian.
text that isn't valid in its character setbłędne bajty jako znak zastępczyTekst w SQLite to UTF-8; jego funkcje błędnie odczytują bajty, które nim nie są.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected
AUTO_INCREMENTINTEGER PRIMARY KEY AUTOINCREMENT, z licznikiem ustawionym za skopiowanymi idSQLite liczy cały całkowity klucz główny. AUTOINCREMENT nie pozwala ponownie użyć id, tak jak MySQL, a licznik idzie dalej od najwyższego id lub od AUTO_INCREMENT ze zrzutu, zależnie od tego, która wartość jest wyższa.
AUTO_INCREMENT on part of a key or outside oneINTEGER bez licznikaSQLite liczy tylko kolumnę, która jest całym kluczem głównym, więc kolumna zachowuje swoje wartości, a nowe wiersze potrzebują własnych.identity_without_counter
ON UPDATE CURRENT_TIMESTAMPwyzwalacz AFTER UPDATEWyzwalacz ustawia kolumnę na bieżący czas, gdy wiersz się zmienia, a aktualizacja jej nie ustawiła, tak jak MySQL.on_update_trigger
generated columnsGENERATED ALWAYS AS, VIRTUAL lub STORED jak w źródleSQLite 3.31 i nowsze obliczają kolumny generowane na te same dwa sposoby.
generated columns with functions SQLite lackszwykła kolumnaFormuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę i wpis w raporcie.generated_not_translated
INVISIBLE columnszwykłe kolumnySQLite nie ma niewidocznych kolumn.invisible_column
CHECK constraintsprzetłumaczone, wewnątrz CREATE TABLESQLite przyjmuje ograniczenia CHECK tylko w CREATE TABLE.
CHECK constraints with functions SQLite lacksnie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla SQLite, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK ... NOT ENFORCEDnie jest tworzoneMySQL przechowuje te ograniczenia bez ich stosowania, więc wiersze mogą je łamać.check_not_enforced
defaults with functions SQLite lacksbrak wartości domyślnejWartość domyślna, której nie da się zapisać dla SQLite, jest pomijana i zgłaszana w raporcie.default_not_translated
keys and indexes on a prefix, c(20)indeks na substr(c, 1, 20)SQLite indeksuje wyrażenia, więc indeksowany jest ten sam prefiks, a unikalny prefiks pozostaje unikalny.prefix_unique
FULLTEXT indexesnie jest tworzoneSQLite przeszukuje tekst za pomocą osobnych tabel FTS5, które wymagają własnych zapytań.fulltext_not_created
SPATIAL indexesnie jest tworzoneSQLite nie ma indeksu przestrzennego na kolumnie.spatial_index_not_created
functional indexes SQLite can't writenie jest tworzonyIndeks na wyrażeniu, którego nie da się zapisać dla SQLite, jest pomijany i zgłaszany w raporcie.index_skipped
foreign keysw CREATE TABLE, ładowane bez sprawdzania, potem wypisywane przez PRAGMA foreign_key_checkSQLite przyjmuje klucze obce tylko w CREATE TABLE i sprawdza je tylko z włączonym PRAGMA foreign_keys. Wiersze ładują się bez sprawdzania, jak z MySQL, a na końcu skrypt wypisuje każdy wiersz bez rodzica.
foreign keys to columns without a unique keynie jest tworzonySQLite wymaga klucza unikalnego na kolumnach, do których się odwołuje; InnoDB nie.foreign_key_skipped
table, index and column namesjak w źródle; zmienione, gdy różnią się tylko wielkością liter lub nazwa indeksu się powtarzaNazwy w SQLite ignorują wielkość liter, a nazwy indeksów dzielą jedną przestrzeń nazw w bazie danych.identifier_renamed
GEOMETRY, POINT, POLYGON...WKB w BLOBStandardowy format well-known binary zachowuje dokładnie każdą geometrię.geometry_as_blob
INET4, INET6, UUID (MariaDB)TEXTSQLite nie ma takich typów; tekst jest taki, jaki zwraca MariaDB.
BINARY, VARBINARY, BLOBBLOBBajty pozostają bajtami.
PARTITION BYjedna tabelaWiersze są te same.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)tabela z bieżącymi wierszamiZrzut zawiera tylko bieżące wiersze.system_versioning_dropped
MyISAM, MEMORY and other engineszwykła tabelaSQLite ma jeden silnik tabel.engine_dropped
dumps of several databasesjeden plik, nazwa każdej tabeli zaczyna się od nazwy jej bazyPlik SQLite to jedna baza danych, więc nazwa bazy odróżnia tabele o tej samej nazwie.databases_merged
views, triggers, procedures, functions and eventswymienione w raporcieIch kod jest napisany w języku MySQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
dumps without CREATE TABLEtypy odczytane z wartościZrzut zrobiony z --no-create-info zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
geometries in a dump without CREATE TABLEWKB w BLOBFormat geometrii MySQL jest rozpoznawany po wartościach i zapisywany jako standardowe WKB.geometry_as_blob
_ci collationsdokładne porównanieSQLite porównuje tekst dokładnie, chyba że ustawisz inaczej, a jego NOCASE ujednolica tylko litery ASCII.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesprzekonwertowane, z ostrzeżeniemmysqldump z MySQL 5.x domyślnie zapisuje 3-bajtowe utf8 i zastępuje każde emoji znakiem zapytania, zanim jakikolwiek konwerter zobaczy plik.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8odczytane jako Latin-1 (Windows-1252)latin1 w MySQL to Windows-1252, zwykłe kodowanie takich zrzutów.charset_guessed
sjis, cp932, gbk, big5 dumpsodczytane jako UTF-8, z ostrzeżeniemTe kodowania nie są jeszcze dekodowane.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsobliczoneNiektóre narzędzia do zrzutów zapisują wartości jako takie wywołania; są odczytywane jako wartości, które zwracają, przy czym w geograficznym WKT najpierw jest długość geograficzna.
other expressions in rowsNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć.expression_value
DEFAULT in VALUESwartość domyślna kolumnyDosłowna wartość domyślna jest kopiowana do wiersza.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLNie ma wartości do skopiowania.default_keyword_null
REPLACE and INSERT IGNOREzwykłe wierszeZrzut ma jeden wiersz na klucz, więc wiersze są te same.replace_as_insert
types IntoSQL doesn't knowTEXTTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
values that don't fit their columnNULLUszkodzony lub ręcznie pisany zrzut może zawierać wartości, których kolumna nie przyjmie; stają się NULL, aby reszta się załadowała.invalid_value_null
unreadable geometriesNULLBajtów, które nie są geometrią, nie da się zapisać jako geometrii.bad_geometry
CREATE SEQUENCE (MariaDB)nie jest tworzoneSQLite nie ma sekwencji.sequence_not_converted
VECTOR(n) (MariaDB 11.7+)TEXT z liczbami float jako tablicą JSONSQLite nie ma typu wektorowego; tablica JSON zachowuje każdą liczbę float.type_replaced

Załaduj skrypt do SQLite

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

sqlite3 -bail mydb.sqlite < mariadb.sqlite.sql

Klucze obce są deklarowane w każdej tabeli, a wiersze ładują się z wyłączonym sprawdzaniem kluczy obcych. Potem skrypt wypisuje każdy wiersz, który wskazuje na nieistniejący wiersz, zamiast przerwać w połowie.

Duży zrzut ładuj do nowego pliku na dysku lokalnym. Skrypt ładuje wszystko w jednej transakcji z wyłączoną synchronizacją, więc działa z szybkością dysku, a przerwane ładowanie nie zostawia niepełnych tabel.

Wiersz poleceń ładuje plik prosto do bazy SQLite, bez pisania skryptu. To nic nie kosztuje.

Jak zrobić zrzut MariaDB dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • --default-character-set=utf8mb4 zachowuje emoji i inne 4-bajtowe znaki, które zrzut utf8mb3 traci, zanim zobaczy go konwerter.
  • --hex-blob zapisuje kolumny binarne i wartości VECTOR szesnastkowo, co przetrwa kopiowanie między systemami.
  • --routines --triggers --events dodają te obiekty do zrzutu, aby raport mógł je wymienić.

Co nie jest konwertowane

Widoki, wyzwalacze, procedury składowane, funkcje i zdarzenia są pisane we własnym języku MariaDB. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla SQLite.

Pytania o konwersję MariaDB do SQLite

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

Z jakich wersji MariaDB może pochodzić zrzut?

Zrzuty z mariadb-dump i mysqldump z MariaDB od 10.3 do 12, z jednym INSERT na tabelę lub jednym na wiersz. Każdy testowy zrzut pochodzi z MariaDB 10.11, 11.4 i 11.8 i jest porównywany ze źródłem komórka po komórce.

Czy kolumny UUID, INET6, JSON i VECTOR są zachowywane?

Kolumny UUID i INET stają się text, JSON text, a VECTOR tablicą JSON jego liczb float. Daty zerowe stają się NULL, a raport je liczy.

Czy wartości AUTO_INCREMENT i sekwencje są zachowywane?

Kolumna AUTO_INCREMENT, która stanowi cały klucz główny tabeli, staje się INTEGER PRIMARY KEY AUTOINCREMENT i idzie dalej po najwyższym id. SQLite nie ma sekwencji, więc trafiają one do raportu.

A procedury składowane i wyzwalacze?

Raport wymienia je z nazwy, ale nie są konwertowane, bo każda baza danych zapisuje je we własnym języku.

Na jakich wersjach SQLite ładuje się skrypt?

SQLite 3.31 i nowsze. Każdy testowy zrzut ładuje się na 3.31 i 3.54 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.