Konversi MariaDB ke SQLite
Letakkan dump dari mariadb-dump, mysqldump, phpMyAdmin, atau Adminer, sebagai .sql atau .sql.gz, lalu unduh skrip SQLite dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan SQLite apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.
18 baris dikonversi, 8 perbaikan, tidak ada yang ditolak
Tabel di shop_2024_mariadb.sqlDump MariaDB 11.8.9-MariaDB-ubu2404 · ditulis oleh mariadb-dump · utf8mb4
customers8 baris3
8 kolom 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 baris5
12 kolom 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;
Perbaikan
- "id" dari customers bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
- "signed_up" dari customers kini mengizinkan NULL: sebagian nilainya tidak bisa disimpan dan menjadi NULL.
- Default "signed_up" di customers, 0000‑00‑00, bukan tanggal yang diterima SQLite, jadi kolom itu tanpa default.
- "customer_id" dari orders bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
- "id" dari orders bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
- "items" dari orders bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
- 1 baris dari "status" di orders berisi nilai kosong yang disimpan MySQL untuk entri tidak valid; CHECK untuk nilainya mengizinkannya.
- "updated_at" dari orders berubah ke waktu saat ini di setiap pembaruan; di SQLite, trigger yang melakukannya.
Perlu diperiksa
- 1 sequence tidak dibuat; SQLite tidak punya sequence. Simpan nilai berikutnya di sebuah tabel jika aplikasi Anda memerlukannya.
- 1 nilai di "signed_up" dari customers adalah tanggal nol atau mustahil, misalnya 0000‑00‑00, yang tidak bisa disimpan SQLite, jadi menjadi NULL. Jika tanggal itu bermakna, ganti di sumber dengan tanggal sungguhan sebelum membuat dump.
- Default "invoice" di orders tidak bisa ditulis untuk SQLite (a sequence), jadi kolom itu tanpa default. Tambahkan default secara manual jika baris baru memerlukannya.
- 1 nilai di "shipped_at" dari orders adalah tanggal nol atau mustahil, misalnya 0000‑00‑00 00:00:00, yang tidak bisa disimpan SQLite, jadi menjadi NULL. Jika tanggal itu bermakna, ganti di sumber dengan tanggal sungguhan sebelum membuat dump.
File Anda dikonversi di komputer ini dan tidak pernah diunggah.
Contoh lain:
Yang berubah dari MariaDB ke SQLite
Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.
TINYINT(1), BOOL
INTEGER dengan nilai apa adanya
SQLite tidak punya tipe boolean; true dan false adalah bilangan bulat 1 dan 0, jadi setiap nilai mempertahankan maknanya.
UNSIGNED integers
INTEGER dengan CHECK bahwa nilainya tidak negatif; BIGINT UNSIGNED dengan nilai di atas 2^63-1 menjadi TEXT
Bilangan bulat SQLite 64-bit dan bertanda. CHECK mencegah nilai negatif seperti di MySQL; nilai di luar rentang bertanda disimpan sebagai teks agar tidak ada digit yang hilang.
Baris laporan: unsigned_widened
ZEROFILL and display widths
dihapus
Isian nol adalah cara menampilkan angka, bukan bagian dari angka. Angkanya dipertahankan; format saat dibaca jika isian itu penting.
Baris laporan: zerofill_dropped
FLOAT(M,D)
REAL, tanpa skala
Bilangan floating-point SQLite tidak punya skala tetap. Nilai yang tersimpan disalin apa adanya.
Baris laporan: float_scale_dropped
DECIMAL(p,s)
DECIMAL(p,s) sampai 15 digit; TEXT jika lebih
SQLite menyimpan sekitar 15 digit signifikan dalam angka. Desimal yang lebih lebar disimpan sebagai teks agar setiap digit tetap tepat.
Baris laporan: decimal_as_text
BIT(1), BIT(n)
INTEGER dengan nilai bitnya; BIT(64) sebagai digit TEXT
Field bit disimpan sebagai angka yang dibentuk bit-bitnya. Bit teratas BIT(64) tidak muat di bilangan bulat bertanda, jadi angkanya disimpan sebagai teks.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
Fungsi tanggal SQLite hanya membaca tanggal kalender yang nyata. Tanggal itu menjadi NULL dan laporan menghitungnya, seperti untuk database lainnya.
Baris laporan: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL dihapus
Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.
Baris laporan: not_null_relaxed
DEFAULT '0000-00-00'
tanpa default
Default yang bukan tanggal nyata dihilangkan, bukan diganti dengan tanggal karangan.
Baris laporan: zero_date_default
TIME
teks TIME seperti yang ditulis MySQL, termasuk durasi
SQLite menyimpan waktu sebagai teks, jadi durasi lebih dari sehari atau di bawah nol disimpan dengan persis.
YEAR
INTEGER dengan CHECK rentangnya
SQLite tidak punya tipe tahun; CHECK mempertahankan nilai yang sama dengan yang diizinkan MySQL.
CHAR(n), VARCHAR(n)
VARCHAR(n), tidak diberlakukan
SQLite menyimpan tipe yang dideklarasikan untuk dibaca alat lain tetapi tidak membatasi panjangnya; nilainya sama dengan yang dikembalikan MySQL.
DATETIME
DATETIME sebagai teks ISO 8601
SQLite menyimpan tanggal sebagai teks yang bisa dibaca fungsi tanggalnya.
TIMESTAMP
TIMESTAMP sebagai teks ISO 8601 dalam UTC; zona yang disebutkan dump, UTC jika tidak disebutkan
TIMESTAMP adalah satu momen, ditulis dalam UTC. Dump menyebutkan zona tempat nilainya ditulis (mysqldump menulis UTC); tanpa itu, nilainya dibaca sebagai UTC dan laporan menyebutkannya.
Baris laporan: timestamp_zone_assumed
ENUM
TEXT dengan CHECK nilainya
Text dengan CHECK mempertahankan nilai yang sama.
ENUM holding '' (MySQL's error value)
nilai kosong yang diizinkan CHECK
MySQL menyimpan string kosong saat nilai tidak valid masuk ke ENUM dalam mode SQL yang longgar. Baris itu dipertahankan dan CHECK mengizinkannya.
Baris laporan: enum_invalid_value
ENUM holding values outside its list
tanpa CHECK
Nilai yang tidak ada di daftar akan gagal di CHECK, jadi CHECK tidak dibuat.
Baris laporan: enum_check_skipped
SET
TEXT seperti yang ditulis MySQL ('a,b')
SQLite tidak punya array; teksnya sama dengan yang dikembalikan MySQL.
JSON
TEXT
Fungsi JSON SQLite membaca JSON dari teks. Kolom yang dideklarasikan JSON akan mengubah "123" menjadi angka, jadi tipenya TEXT.
NUL bytes in text
dipertahankan
Teks SQLite bisa memuat byte NUL, jadi nilainya disalin apa adanya.
text that isn't valid in its character set
byte yang rusak menjadi karakter pengganti
Teks SQLite adalah UTF-8; fungsinya salah membaca byte yang bukan UTF-8.
Baris laporan: invalid_utf8_replaced
text decoded twice (ñ)
disalin apa adanya
Dump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.
Baris laporan: mojibake_suspected
AUTO_INCREMENT
INTEGER PRIMARY KEY AUTOINCREMENT, dengan penghitung diatur melewati id yang disalin
SQLite menghitung primary key bilangan bulat yang utuh. AUTOINCREMENT mencegah id dipakai ulang, seperti di MySQL, dan penghitung berlanjut setelah id tertinggi atau AUTO_INCREMENT dari dump, mana yang lebih tinggi.
AUTO_INCREMENT on part of a key or outside one
INTEGER tanpa penghitung
SQLite hanya menghitung kolom yang menjadi seluruh primary key, jadi kolom itu mempertahankan nilainya dan baris baru perlu mengisi nilainya sendiri.
Baris laporan: identity_without_counter
ON UPDATE CURRENT_TIMESTAMP
trigger AFTER UPDATE
Trigger mengatur kolom ke waktu saat ini ketika baris berubah dan pembaruannya tidak mengatur kolom itu, seperti di MySQL.
Baris laporan: on_update_trigger
generated columns
GENERATED ALWAYS AS, VIRTUAL atau STORED seperti di sumber
SQLite 3.31 dan yang lebih baru menghitung kolom generated dengan dua cara yang sama.
generated columns with functions SQLite lacks
kolom biasa
Rumus yang tidak bisa ditulis untuk SQLite menyisakan kolom biasa dan satu baris laporan.
Baris laporan: generated_not_translated
INVISIBLE columns
kolom biasa
SQLite tidak punya kolom yang tidak terlihat.
Baris laporan: invisible_column
CHECK constraints
diterjemahkan, langsung di CREATE TABLE
SQLite hanya menerima CHECK di CREATE TABLE.
CHECK constraints with functions SQLite lacks
tidak dibuat
CHECK yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan.
Baris laporan: check_skipped
CHECK ... NOT ENFORCED
tidak dibuat
MySQL menyimpan CHECK ini tanpa menerapkannya, jadi baris bisa melanggarnya.
Baris laporan: check_not_enforced
defaults with functions SQLite lacks
tanpa default
Default yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan.
Baris laporan: default_not_translated
keys and indexes on a prefix, c(20)
indeks pada substr(c, 1, 20)
SQLite bisa mengindeks ekspresi, jadi prefiks yang sama diindeks dan prefiks yang unik tetap unik.
Baris laporan: prefix_unique
FULLTEXT indexes
tidak dibuat
SQLite mencari teks dengan tabel FTS5 terpisah, yang memerlukan kueri sendiri.
Baris laporan: fulltext_not_created
SPATIAL indexes
tidak dibuat
SQLite tidak punya indeks spasial pada kolom.
Baris laporan: spatial_index_not_created
functional indexes SQLite can't write
tidak dibuat
Indeks pada ekspresi yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan.
Baris laporan: index_skipped
foreign keys
di CREATE TABLE, dimuat tanpa pemeriksaan, lalu dicantumkan oleh PRAGMA foreign_key_check
SQLite hanya menerima foreign key di CREATE TABLE dan hanya memeriksanya jika PRAGMA foreign_keys aktif. Baris dimuat tanpa pemeriksaan, seperti dari MySQL, dan skrip diakhiri dengan mencantumkan setiap baris tanpa induk.
foreign keys to columns without a unique key
tidak dibuat
SQLite memerlukan kunci unik pada kolom yang dirujuk; InnoDB tidak.
Baris laporan: foreign_key_skipped
table, index and column names
seperti ditulis; diganti nama jika hanya berbeda huruf besar-kecil atau nama indeks berulang
Nama di SQLite tidak membedakan huruf besar-kecil, dan nama indeks berbagi satu namespace per database.
Baris laporan: identifier_renamed
GEOMETRY, POINT, POLYGON...
WKB dalam BLOB
Format biner well-known standar mempertahankan setiap geometri dengan persis.
Baris laporan: geometry_as_blob
INET4, INET6, UUID (MariaDB)
TEXT
SQLite tidak punya tipe ini; teksnya sama dengan yang dikembalikan MariaDB.
BINARY, VARBINARY, BLOB
BLOB
Byte tetap byte.
PARTITION BY
satu tabel
Barisnya sama.
Baris laporan: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
tabel dengan baris saat ini
Dump hanya berisi baris saat ini.
Baris laporan: system_versioning_dropped
MyISAM, MEMORY and other engines
tabel biasa
SQLite punya satu engine tabel.
Baris laporan: engine_dropped
dumps of several databases
satu file, setiap tabel diberi nama database-nya di depan
Satu file SQLite adalah satu database, jadi nama database membedakan tabel yang bernama sama.
Baris laporan: databases_merged
views, triggers, procedures, functions and events
dicantumkan di laporan
Kodenya ditulis dalam bahasa MySQL, jadi dicantumkan agar Anda bisa membuatnya ulang.
Baris laporan: not_converted_objects
dumps without CREATE TABLE
tipe dibaca dari nilai
Dump yang dibuat dengan --no-create-info hanya berisi baris, jadi tipenya diambil dari nilai.
Baris laporan: no_schema
geometries in a dump without CREATE TABLE
WKB dalam BLOB
Format geometri MySQL dikenali dari nilainya dan disimpan sebagai WKB standar.
Baris laporan: geometry_as_blob
_ci collations
perbandingan persis
SQLite membandingkan teks secara persis kecuali diminta lain, dan NOCASE-nya hanya berlaku untuk huruf ASCII.
Baris laporan: case_insensitive_collation
SET NAMES utf8 from utf8mb4 tables
dikonversi, dengan peringatan
mysqldump di MySQL 5.x secara default menulis utf8 3 byte dan mengganti setiap emoji dengan tanda tanya sebelum konverter mana pun melihat file itu.
Baris laporan: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
dibaca sebagai Latin-1 (Windows-1252)
latin1 di MySQL adalah Windows-1252, pengodean yang biasa dipakai dump semacam itu.
Baris laporan: charset_guessed
sjis, cp932, gbk, big5 dumps
dibaca sebagai UTF-8, dengan peringatan
Pengodean ini belum didekode.
Baris laporan: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
dievaluasi
Beberapa alat dump menulis nilai sebagai panggilan ini; panggilan itu dibaca sebagai nilai yang dihasilkannya, dengan WKT geografis diubah agar longitude lebih dulu.
other expressions in rows
NULL
Konverter yang tidak menjalankan database tidak bisa mengevaluasinya.
Baris laporan: expression_value
DEFAULT in VALUES
nilai default kolom
Default literal disalin ke baris.
Baris laporan: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Tidak ada nilai untuk disalin.
Baris laporan: default_keyword_null
REPLACE and INSERT IGNORE
baris biasa
Dump punya satu baris per kunci, jadi barisnya sama.
Baris laporan: replace_as_insert
types IntoSQL doesn't know
TEXT
Text memuat nilai apa pun; ubah tipenya setelah pemuatan.
Baris laporan: unknown_type
values that don't fit their column
NULL
Dump yang rusak atau ditulis manual bisa berisi nilai yang tidak muat di kolomnya; nilai itu menjadi NULL agar sisanya tetap dimuat.
Baris laporan: invalid_value_null
unreadable geometries
NULL
Byte yang bukan geometri tidak bisa disimpan sebagai geometri.
Baris laporan: bad_geometry
CREATE SEQUENCE (MariaDB)
tidak dibuat
SQLite tidak punya sequence.
Baris laporan: sequence_not_converted
VECTOR(n) (MariaDB 11.7+)
TEXT dengan float sebagai array JSON
SQLite tidak punya tipe vektor; array JSON mempertahankan setiap float.
Baris laporan: type_replaced
| Di MariaDB | Di SQLite | Baris laporan |
|---|---|---|
| TINYINT(1), BOOL | INTEGER dengan nilai apa adanyaSQLite tidak punya tipe boolean; true dan false adalah bilangan bulat 1 dan 0, jadi setiap nilai mempertahankan maknanya. | |
| UNSIGNED integers | INTEGER dengan CHECK bahwa nilainya tidak negatif; BIGINT UNSIGNED dengan nilai di atas 2^63-1 menjadi TEXTBilangan bulat SQLite 64-bit dan bertanda. CHECK mencegah nilai negatif seperti di MySQL; nilai di luar rentang bertanda disimpan sebagai teks agar tidak ada digit yang hilang. | unsigned_widened |
| ZEROFILL and display widths | dihapusIsian nol adalah cara menampilkan angka, bukan bagian dari angka. Angkanya dipertahankan; format saat dibaca jika isian itu penting. | zerofill_dropped |
| FLOAT(M,D) | REAL, tanpa skalaBilangan floating-point SQLite tidak punya skala tetap. Nilai yang tersimpan disalin apa adanya. | float_scale_dropped |
| DECIMAL(p,s) | DECIMAL(p,s) sampai 15 digit; TEXT jika lebihSQLite menyimpan sekitar 15 digit signifikan dalam angka. Desimal yang lebih lebar disimpan sebagai teks agar setiap digit tetap tepat. | decimal_as_text |
| BIT(1), BIT(n) | INTEGER dengan nilai bitnya; BIT(64) sebagai digit TEXTField bit disimpan sebagai angka yang dibentuk bit-bitnya. Bit teratas BIT(64) tidak muat di bilangan bulat bertanda, jadi angkanya disimpan sebagai teks. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLFungsi tanggal SQLite hanya membaca tanggal kalender yang nyata. Tanggal itu menjadi NULL dan laporan menghitungnya, seperti untuk database lainnya. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti. | not_null_relaxed |
| DEFAULT '0000-00-00' | tanpa defaultDefault yang bukan tanggal nyata dihilangkan, bukan diganti dengan tanggal karangan. | zero_date_default |
| TIME | teks TIME seperti yang ditulis MySQL, termasuk durasiSQLite menyimpan waktu sebagai teks, jadi durasi lebih dari sehari atau di bawah nol disimpan dengan persis. | |
| YEAR | INTEGER dengan CHECK rentangnyaSQLite tidak punya tipe tahun; CHECK mempertahankan nilai yang sama dengan yang diizinkan MySQL. | |
| CHAR(n), VARCHAR(n) | VARCHAR(n), tidak diberlakukanSQLite menyimpan tipe yang dideklarasikan untuk dibaca alat lain tetapi tidak membatasi panjangnya; nilainya sama dengan yang dikembalikan MySQL. | |
| DATETIME | DATETIME sebagai teks ISO 8601SQLite menyimpan tanggal sebagai teks yang bisa dibaca fungsi tanggalnya. | |
| TIMESTAMP | TIMESTAMP sebagai teks ISO 8601 dalam UTC; zona yang disebutkan dump, UTC jika tidak disebutkanTIMESTAMP adalah satu momen, ditulis dalam UTC. Dump menyebutkan zona tempat nilainya ditulis (mysqldump menulis UTC); tanpa itu, nilainya dibaca sebagai UTC dan laporan menyebutkannya. | timestamp_zone_assumed |
| ENUM | TEXT dengan CHECK nilainyaText dengan CHECK mempertahankan nilai yang sama. | |
| ENUM holding '' (MySQL's error value) | nilai kosong yang diizinkan CHECKMySQL menyimpan string kosong saat nilai tidak valid masuk ke ENUM dalam mode SQL yang longgar. Baris itu dipertahankan dan CHECK mengizinkannya. | enum_invalid_value |
| ENUM holding values outside its list | tanpa CHECKNilai yang tidak ada di daftar akan gagal di CHECK, jadi CHECK tidak dibuat. | enum_check_skipped |
| SET | TEXT seperti yang ditulis MySQL ('a,b')SQLite tidak punya array; teksnya sama dengan yang dikembalikan MySQL. | |
| JSON | TEXTFungsi JSON SQLite membaca JSON dari teks. Kolom yang dideklarasikan JSON akan mengubah "123" menjadi angka, jadi tipenya TEXT. | |
| NUL bytes in text | dipertahankanTeks SQLite bisa memuat byte NUL, jadi nilainya disalin apa adanya. | |
| text that isn't valid in its character set | byte yang rusak menjadi karakter penggantiTeks SQLite adalah UTF-8; fungsinya salah membaca byte yang bukan UTF-8. | invalid_utf8_replaced |
| text decoded twice (ñ) | disalin apa adanyaDump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya. | mojibake_suspected |
| AUTO_INCREMENT | INTEGER PRIMARY KEY AUTOINCREMENT, dengan penghitung diatur melewati id yang disalinSQLite menghitung primary key bilangan bulat yang utuh. AUTOINCREMENT mencegah id dipakai ulang, seperti di MySQL, dan penghitung berlanjut setelah id tertinggi atau AUTO_INCREMENT dari dump, mana yang lebih tinggi. | |
| AUTO_INCREMENT on part of a key or outside one | INTEGER tanpa penghitungSQLite hanya menghitung kolom yang menjadi seluruh primary key, jadi kolom itu mempertahankan nilainya dan baris baru perlu mengisi nilainya sendiri. | identity_without_counter |
| ON UPDATE CURRENT_TIMESTAMP | trigger AFTER UPDATETrigger mengatur kolom ke waktu saat ini ketika baris berubah dan pembaruannya tidak mengatur kolom itu, seperti di MySQL. | on_update_trigger |
| generated columns | GENERATED ALWAYS AS, VIRTUAL atau STORED seperti di sumberSQLite 3.31 dan yang lebih baru menghitung kolom generated dengan dua cara yang sama. | |
| generated columns with functions SQLite lacks | kolom biasaRumus yang tidak bisa ditulis untuk SQLite menyisakan kolom biasa dan satu baris laporan. | generated_not_translated |
| INVISIBLE columns | kolom biasaSQLite tidak punya kolom yang tidak terlihat. | invisible_column |
| CHECK constraints | diterjemahkan, langsung di CREATE TABLESQLite hanya menerima CHECK di CREATE TABLE. | |
| CHECK constraints with functions SQLite lacks | tidak dibuatCHECK yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan. | check_skipped |
| CHECK ... NOT ENFORCED | tidak dibuatMySQL menyimpan CHECK ini tanpa menerapkannya, jadi baris bisa melanggarnya. | check_not_enforced |
| defaults with functions SQLite lacks | tanpa defaultDefault yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan. | default_not_translated |
| keys and indexes on a prefix, c(20) | indeks pada substr(c, 1, 20)SQLite bisa mengindeks ekspresi, jadi prefiks yang sama diindeks dan prefiks yang unik tetap unik. | prefix_unique |
| FULLTEXT indexes | tidak dibuatSQLite mencari teks dengan tabel FTS5 terpisah, yang memerlukan kueri sendiri. | fulltext_not_created |
| SPATIAL indexes | tidak dibuatSQLite tidak punya indeks spasial pada kolom. | spatial_index_not_created |
| functional indexes SQLite can't write | tidak dibuatIndeks pada ekspresi yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan. | index_skipped |
| foreign keys | di CREATE TABLE, dimuat tanpa pemeriksaan, lalu dicantumkan oleh PRAGMA foreign_key_checkSQLite hanya menerima foreign key di CREATE TABLE dan hanya memeriksanya jika PRAGMA foreign_keys aktif. Baris dimuat tanpa pemeriksaan, seperti dari MySQL, dan skrip diakhiri dengan mencantumkan setiap baris tanpa induk. | |
| foreign keys to columns without a unique key | tidak dibuatSQLite memerlukan kunci unik pada kolom yang dirujuk; InnoDB tidak. | foreign_key_skipped |
| table, index and column names | seperti ditulis; diganti nama jika hanya berbeda huruf besar-kecil atau nama indeks berulangNama di SQLite tidak membedakan huruf besar-kecil, dan nama indeks berbagi satu namespace per database. | identifier_renamed |
| GEOMETRY, POINT, POLYGON... | WKB dalam BLOBFormat biner well-known standar mempertahankan setiap geometri dengan persis. | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | TEXTSQLite tidak punya tipe ini; teksnya sama dengan yang dikembalikan MariaDB. | |
| BINARY, VARBINARY, BLOB | BLOBByte tetap byte. | |
| PARTITION BY | satu tabelBarisnya sama. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | tabel dengan baris saat iniDump hanya berisi baris saat ini. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | tabel biasaSQLite punya satu engine tabel. | engine_dropped |
| dumps of several databases | satu file, setiap tabel diberi nama database-nya di depanSatu file SQLite adalah satu database, jadi nama database membedakan tabel yang bernama sama. | databases_merged |
| views, triggers, procedures, functions and events | dicantumkan di laporanKodenya ditulis dalam bahasa MySQL, jadi dicantumkan agar Anda bisa membuatnya ulang. | not_converted_objects |
| dumps without CREATE TABLE | tipe dibaca dari nilaiDump yang dibuat dengan --no-create-info hanya berisi baris, jadi tipenya diambil dari nilai. | no_schema |
| geometries in a dump without CREATE TABLE | WKB dalam BLOBFormat geometri MySQL dikenali dari nilainya dan disimpan sebagai WKB standar. | geometry_as_blob |
| _ci collations | perbandingan persisSQLite membandingkan teks secara persis kecuali diminta lain, dan NOCASE-nya hanya berlaku untuk huruf ASCII. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | dikonversi, dengan peringatanmysqldump di MySQL 5.x secara default menulis utf8 3 byte dan mengganti setiap emoji dengan tanda tanya sebelum konverter mana pun melihat file itu. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | dibaca sebagai Latin-1 (Windows-1252)latin1 di MySQL adalah Windows-1252, pengodean yang biasa dipakai dump semacam itu. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | dibaca sebagai UTF-8, dengan peringatanPengodean ini belum didekode. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | dievaluasiBeberapa alat dump menulis nilai sebagai panggilan ini; panggilan itu dibaca sebagai nilai yang dihasilkannya, dengan WKT geografis diubah agar longitude lebih dulu. | |
| other expressions in rows | NULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya. | expression_value |
| DEFAULT in VALUES | nilai default kolomDefault literal disalin ke baris. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLTidak ada nilai untuk disalin. | default_keyword_null |
| REPLACE and INSERT IGNORE | baris biasaDump punya satu baris per kunci, jadi barisnya sama. | replace_as_insert |
| types IntoSQL doesn't know | TEXTText memuat nilai apa pun; ubah tipenya setelah pemuatan. | unknown_type |
| values that don't fit their column | NULLDump yang rusak atau ditulis manual bisa berisi nilai yang tidak muat di kolomnya; nilai itu menjadi NULL agar sisanya tetap dimuat. | invalid_value_null |
| unreadable geometries | NULLByte yang bukan geometri tidak bisa disimpan sebagai geometri. | bad_geometry |
| CREATE SEQUENCE (MariaDB) | tidak dibuatSQLite tidak punya sequence. | sequence_not_converted |
| VECTOR(n) (MariaDB 11.7+) | TEXT dengan float sebagai array JSONSQLite tidak punya tipe vektor; array JSON mempertahankan setiap float. | type_replaced |
Muat skrip ke SQLite
Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.
sqlite3 -bail mydb.sqlite < mariadb.sqlite.sqlForeign key dideklarasikan di setiap tabel dan baris dimuat dengan pemeriksaan foreign key nonaktif. Lalu skrip mencantumkan setiap baris yang merujuk ke baris yang tidak ada, bukan gagal di tengah jalan.
Untuk dump yang besar, muat ke file baru di disk lokal. Skrip memuat semuanya dalam satu transaksi dengan sinkronisasi nonaktif, jadi berjalan secepat disk, dan pemuatan yang berhenti di tengah jalan tidak meninggalkan tabel setengah jadi.
Command line memuat file langsung ke database SQLite, tanpa menulis skrip. Gratis.
Buat dump MariaDB untuk hasil terbaik
Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:
- --default-character-set=utf8mb4 mempertahankan emoji dan karakter 4 byte lainnya, yang hilang di dump utf8mb3 sebelum konverter melihatnya.
- --hex-blob menulis kolom biner dan nilai VECTOR sebagai heksadesimal, yang tetap utuh saat disalin antarsistem.
- --routines --triggers --events menambahkan objek-objek itu ke dump, sehingga laporan bisa mencantumkannya.
Yang tidak dikonversi
View, trigger, stored procedure, fungsi, dan event ditulis dalam bahasa MariaDB sendiri. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk SQLite.
Pertanyaan tentang MariaDB ke SQLite
Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak
Apakah dump saya diunggah?
Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.
Seberapa besar dump yang bisa dipakai?
Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.
Dump dari versi MariaDB mana yang bisa dipakai?
Dump dari mariadb-dump dan mysqldump di MariaDB 10.3 sampai 12, dengan satu INSERT per tabel atau satu per baris. Setiap dump uji berasal dari MariaDB 10.11, 11.4, dan 11.8 dan dibandingkan dengan sumbernya sel demi sel.
Apakah kolom UUID, INET6, JSON, dan VECTOR dipertahankan?
Kolom UUID dan INET menjadi text, JSON menjadi text, dan VECTOR menjadi array JSON berisi float-nya. Tanggal nol menjadi NULL dan laporan menghitungnya.
Apakah nilai AUTO_INCREMENT dan sequence dipertahankan?
Kolom AUTO_INCREMENT yang menjadi seluruh primary key tabel menjadi INTEGER PRIMARY KEY AUTOINCREMENT dan berlanjut setelah id tertinggi. SQLite tidak punya sequence, jadi sequence dicantumkan di laporan.
Bagaimana dengan stored procedure dan trigger?
Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.
Di versi SQLite mana skrip bisa dimuat?
SQLite 3.31 dan yang lebih baru. Setiap dump uji dimuat di 3.31 dan 3.54, dan berhenti di galat pertama jika ada yang salah.