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.
18 wierszy przekonwertowanych, 8 poprawek, brak odrzuconych
Tabele w pliku shop_2024_mariadb.sqlZrzut MariaDB 11.8.9-MariaDB-ubu2404 · zapisany przez mariadb-dump · utf8mb4
customers8 wierszy3
8 kolumn id INTEGER not null name VARCHAR(100) not null email VARCHAR(150) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATE created_at TIMESTAMP not null last_ip TEXT orders10 wierszy5
12 kolumn id INTEGER not null customer_id INTEGER not null status TEXT not null total DECIMAL(10,2) not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note VARCHAR(255) order_ref TEXT not null invoice INTEGER not null details TEXT updated_at TIMESTAMP not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;
CREATE TABLE customers ( -- People who bought at least once
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
country VARCHAR(2) DEFAULT 'US' NOT NULL,
is_active INTEGER DEFAULT 1 NOT NULL,
signed_up DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
last_ip TEXT,
CONSTRAINT customers_id_check CHECK (id >= 0)
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
status TEXT DEFAULT 'pending' NOT NULL,
total DECIMAL(10,2) NOT NULL,
items INTEGER DEFAULT 1 NOT NULL,
ordered_at DATETIME NOT NULL,
shipped_at DATETIME,
note VARCHAR(255),
order_ref TEXT NOT NULL,
invoice INTEGER NOT NULL,
details TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT orders_id_check CHECK (id >= 0),
CONSTRAINT orders_customer_id_check CHECK (customer_id >= 0),
CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled', '')),
CONSTRAINT orders_items_check CHECK (items >= 0),
CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id)
);
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at, last_ip) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00','::ffff:203.0.113.7'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42','2001:db8::1'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17',NULL),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00','::ffff:198.51.100.23'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00',NULL),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00','2001:db8:85a3::8a2e:370:7334'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59','::ffff:192.0.2.200'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, order_ref, invoice, details, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,'{"gift": false}','2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,'{"gift": true, "wrap": "red"}','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,'{"fragile": true}','2024-03-07 08:00:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice','4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'2024-03-08 17:20:00'),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,'{"fragile": true}','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,NULL,'2024-03-11 18:46:00'),
(8,2,'',19.99,1,'2024-03-12 08:00:00',NULL,'Status lost in an old import','7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,'{"parcels": [1, 2]}','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'2024-03-15 21:05:00');
-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_uq_email ON customers (email);
CREATE INDEX orders_idx_customer ON orders (customer_id);
CREATE INDEX orders_idx_status_date ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 1000) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 1000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 5000) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 5000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
CREATE TRIGGER orders_updated_at_on_update AFTER UPDATE ON orders FOR EACH ROW WHEN NEW.updated_at IS OLD.updated_at AND (NEW.id IS NOT OLD.id OR NEW.customer_id IS NOT OLD.customer_id OR NEW.status IS NOT OLD.status OR NEW.total IS NOT OLD.total OR NEW.items IS NOT OLD.items OR NEW.ordered_at IS NOT OLD.ordered_at OR NEW.shipped_at IS NOT OLD.shipped_at OR NEW.note IS NOT OLD.note OR NEW.order_ref IS NOT OLD.order_ref OR NEW.invoice IS NOT OLD.invoice OR NEW.details IS NOT OLD.details)
BEGIN
UPDATE orders SET updated_at = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;
END;
COMMIT;
-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;
Poprawki
- "id" w tabeli customers jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
- "signed_up" w tabeli customers dopuszcza teraz NULL: części jej wartości nie dało się zapisać i są NULL.
- 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.
- "customer_id" w tabeli orders jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
- "id" w tabeli orders jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
- "items" w tabeli orders jest bez znaku, więc ma typ INTEGER z ograniczeniem CHECK, że nie jest ujemna.
- W "status" tabeli orders 1 wiersz zawiera pustą wartość, którą MySQL zapisuje dla błędnych danych; ograniczenie CHECK kolumny ją dopuszcza.
- "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 MariaDB | W SQLite | Wpis w raporcie |
|---|---|---|
| TINYINT(1), BOOL | INTEGER 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 integers | INTEGER 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 widths | usunię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 NULL | NOT 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 |
| TIME | TIME 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. | |
| YEAR | INTEGER 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. | |
| DATETIME | DATETIME jako tekst ISO 8601SQLite 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 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 |
| ENUM | TEXT 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 list | bez CHECKWartości spoza listy nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone. | enum_check_skipped |
| SET | TEXT w zapisie MySQL ('a,b')SQLite nie ma tablic; tekst jest taki, jaki zwraca MySQL. | |
| JSON | TEXTFunkcje JSON w SQLite odczytują JSON z tekstu. Kolumna zadeklarowana jako JSON zamieniłaby "123" na liczbę, więc jest TEXT. | |
| NUL bytes in text | zachowaneTekst 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ę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_INCREMENT | INTEGER 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 one | INTEGER 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_TIMESTAMP | wyzwalacz 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 columns | GENERATED 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 lacks | zwykła kolumnaFormuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę i wpis w raporcie. | generated_not_translated |
| INVISIBLE columns | zwykłe kolumnySQLite nie ma niewidocznych kolumn. | invisible_column |
| CHECK constraints | przetłumaczone, wewnątrz CREATE TABLESQLite przyjmuje ograniczenia CHECK tylko w CREATE TABLE. | |
| CHECK constraints with functions SQLite lacks | nie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla SQLite, jest pomijane i zgłaszane w raporcie. | check_skipped |
| CHECK ... NOT ENFORCED | nie jest tworzoneMySQL przechowuje te ograniczenia bez ich stosowania, więc wiersze mogą je łamać. | check_not_enforced |
| defaults with functions SQLite lacks | brak 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 indexes | nie jest tworzoneSQLite przeszukuje tekst za pomocą osobnych tabel FTS5, które wymagają własnych zapytań. | fulltext_not_created |
| SPATIAL indexes | nie jest tworzoneSQLite nie ma indeksu przestrzennego na kolumnie. | spatial_index_not_created |
| functional indexes SQLite can't write | nie jest tworzonyIndeks na wyrażeniu, którego nie da się zapisać dla SQLite, jest pomijany i zgłaszany w raporcie. | index_skipped |
| foreign keys | w 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 key | nie jest tworzonySQLite wymaga klucza unikalnego na kolumnach, do których się odwołuje; InnoDB nie. | 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ę 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, BLOB | BLOBBajty pozostają bajtami. | |
| PARTITION BY | jedna 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 engines | zwykła tabelaSQLite ma jeden silnik tabel. | engine_dropped |
| dumps of several databases | jeden 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 events | wymienione w raporcieIch kod jest napisany w języku MySQL, więc trafiają na listę do ręcznego odtworzenia. | not_converted_objects |
| dumps without CREATE TABLE | typy 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 TABLE | WKB w BLOBFormat geometrii MySQL jest rozpoznawany po wartościach i zapisywany jako standardowe WKB. | geometry_as_blob |
| _ci collations | dokł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 tables | przekonwertowane, 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-8 | odczytane jako Latin-1 (Windows-1252)latin1 w MySQL to Windows-1252, zwykłe kodowanie takich zrzutów. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | odczytane jako UTF-8, z ostrzeżeniemTe kodowania nie są jeszcze dekodowane. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | obliczoneNiektó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 | NULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć. | expression_value |
| DEFAULT in VALUES | wartość domyślna kolumnyDosłowna wartość domyślna jest kopiowana do wiersza. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLNie ma wartości do skopiowania. | default_keyword_null |
| REPLACE and INSERT IGNORE | zwykłe wierszeZrzut ma jeden wiersz na klucz, więc wiersze są te same. | replace_as_insert |
| types IntoSQL doesn't know | TEXTTekst mieści każdą wartość; zmień typ po załadowaniu. | unknown_type |
| values that don't fit their column | NULLUszkodzony 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 geometries | NULLBajtó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.sqlKlucze 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.