Langsung ke konten
Beranda IntoSQL

Konversi MySQL ke SQLite

Letakkan dump dari mysqldump, mariadb-dump, mysqlpump, 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.

File Anda
sqlshop_2024.sqlFile contoh, 5,1 kB
Database Anda

18 baris dikonversi, 8 perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024.sqlDump MySQL 8.0.46 · ditulis oleh mysqldump · utf8mb4

  • customers8 baris3
    7 kolom
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(150) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATE
    created_atTIMESTAMP not null
  • orders10 baris5
    9 kolom
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteVARCHAR(255)
    updated_atTIMESTAMP not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

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

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

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17'),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00'),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','2024-03-07 08:00:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice','2024-03-08 17:20:00'),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'2024-03-11 18:46:00'),
(8,2,'',19.99,1,'2024-03-12 08:00:00',NULL,'Status lost in an old import','2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','2024-03-15 21:05:00');

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

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

Perbaikan

  1. "id" dari customers bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
  2. "signed_up" dari customers kini mengizinkan NULL: sebagian nilainya tidak bisa disimpan dan menjadi NULL.
  3. Default "signed_up" di customers, 0000‑00‑00, bukan tanggal yang diterima SQLite, jadi kolom itu tanpa default.
  4. "customer_id" dari orders bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
  5. "id" dari orders bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
  6. "items" dari orders bersifat unsigned, jadi menjadi INTEGER dengan CHECK bahwa nilainya tidak negatif.
  7. 1 baris dari "status" di orders berisi nilai kosong yang disimpan MySQL untuk entri tidak valid; CHECK untuk nilainya mengizinkannya.
  8. "updated_at" dari orders berubah ke waktu saat ini di setiap pembaruan; di SQLite, trigger yang melakukannya.

Perlu diperiksa

  • 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.
  • 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 MySQL 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 MySQLDi SQLiteBaris laporan
TINYINT(1), BOOLINTEGER dengan nilai apa adanyaSQLite tidak punya tipe boolean; true dan false adalah bilangan bulat 1 dan 0, jadi setiap nilai mempertahankan maknanya.
UNSIGNED integersINTEGER 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 widthsdihapusIsian 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 NULLNOT 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
TIMEteks TIME seperti yang ditulis MySQL, termasuk durasiSQLite menyimpan waktu sebagai teks, jadi durasi lebih dari sehari atau di bawah nol disimpan dengan persis.
YEARINTEGER 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.
DATETIMEDATETIME sebagai teks ISO 8601SQLite menyimpan tanggal sebagai teks yang bisa dibaca fungsi tanggalnya.
TIMESTAMPTIMESTAMP 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
ENUMTEXT 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 listtanpa CHECKNilai yang tidak ada di daftar akan gagal di CHECK, jadi CHECK tidak dibuat.enum_check_skipped
SETTEXT seperti yang ditulis MySQL ('a,b')SQLite tidak punya array; teksnya sama dengan yang dikembalikan MySQL.
JSONTEXTFungsi JSON SQLite membaca JSON dari teks. Kolom yang dideklarasikan JSON akan mengubah "123" menjadi angka, jadi tipenya TEXT.
NUL bytes in textdipertahankanTeks SQLite bisa memuat byte NUL, jadi nilainya disalin apa adanya.
text that isn't valid in its character setbyte 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_INCREMENTINTEGER 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 oneINTEGER 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_TIMESTAMPtrigger AFTER UPDATETrigger mengatur kolom ke waktu saat ini ketika baris berubah dan pembaruannya tidak mengatur kolom itu, seperti di MySQL.on_update_trigger
generated columnsGENERATED 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 lackskolom biasaRumus yang tidak bisa ditulis untuk SQLite menyisakan kolom biasa dan satu baris laporan.generated_not_translated
INVISIBLE columnskolom biasaSQLite tidak punya kolom yang tidak terlihat.invisible_column
CHECK constraintsditerjemahkan, langsung di CREATE TABLESQLite hanya menerima CHECK di CREATE TABLE.
CHECK constraints with functions SQLite lackstidak dibuatCHECK yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan.check_skipped
CHECK ... NOT ENFORCEDtidak dibuatMySQL menyimpan CHECK ini tanpa menerapkannya, jadi baris bisa melanggarnya.check_not_enforced
defaults with functions SQLite lackstanpa 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 indexestidak dibuatSQLite mencari teks dengan tabel FTS5 terpisah, yang memerlukan kueri sendiri.fulltext_not_created
SPATIAL indexestidak dibuatSQLite tidak punya indeks spasial pada kolom.spatial_index_not_created
functional indexes SQLite can't writetidak dibuatIndeks pada ekspresi yang tidak bisa ditulis untuk SQLite dihilangkan dan dilaporkan.index_skipped
foreign keysdi 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 keytidak dibuatSQLite memerlukan kunci unik pada kolom yang dirujuk; InnoDB tidak.foreign_key_skipped
table, index and column namesseperti 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, BLOBBLOBByte tetap byte.
PARTITION BYsatu 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 enginestabel biasaSQLite punya satu engine tabel.engine_dropped
dumps of several databasessatu 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 eventsdicantumkan di laporanKodenya ditulis dalam bahasa MySQL, jadi dicantumkan agar Anda bisa membuatnya ulang.not_converted_objects
dumps without CREATE TABLEtipe 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 TABLEWKB dalam BLOBFormat geometri MySQL dikenali dari nilainya dan disimpan sebagai WKB standar.geometry_as_blob
_ci collationsperbandingan persisSQLite membandingkan teks secara persis kecuali diminta lain, dan NOCASE-nya hanya berlaku untuk huruf ASCII.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesdikonversi, 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-8dibaca sebagai Latin-1 (Windows-1252)latin1 di MySQL adalah Windows-1252, pengodean yang biasa dipakai dump semacam itu.charset_guessed
sjis, cp932, gbk, big5 dumpsdibaca sebagai UTF-8, dengan peringatanPengodean ini belum didekode.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsdievaluasiBeberapa 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 rowsNULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya.expression_value
DEFAULT in VALUESnilai default kolomDefault literal disalin ke baris.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLTidak ada nilai untuk disalin.default_keyword_null
REPLACE and INSERT IGNOREbaris biasaDump punya satu baris per kunci, jadi barisnya sama.replace_as_insert
types IntoSQL doesn't knowTEXTText memuat nilai apa pun; ubah tipenya setelah pemuatan.unknown_type
values that don't fit their columnNULLDump 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 geometriesNULLByte 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 < mysql.sqlite.sql

Foreign 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 MySQL 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 utf8 sebelum konverter melihatnya.
  • --hex-blob menulis kolom biner 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 masing-masing database. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk SQLite.

Pertanyaan tentang MySQL 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.

Apakah dump MariaDB bisa dibaca?

Ya. Dump dari mariadb-dump dan dari MariaDB 10.3 sampai 12 dikonversi dengan cara yang sama, termasuk kolom INET6, INET4, dan UUID milik MariaDB.

Apa yang terjadi pada tanggal 0000-00-00?

Tanggal itu menjadi NULL: SQLite akan menyimpan teksnya, tetapi tidak ada yang membaca 0000-00-00 sebagai tanggal. Laporan menyebutkan jumlahnya di setiap kolom.

Apakah nilai AUTO_INCREMENT dipertahankan?

Ya. Kolom AUTO_INCREMENT yang menjadi seluruh primary key tabel menjadi INTEGER PRIMARY KEY AUTOINCREMENT, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi. Kolom AUTO_INCREMENT lainnya mempertahankan nilainya tanpa penghitung, dan laporan menyebutkannya.

Apakah TINYINT(1) menjadi boolean?

Tidak. SQLite tidak punya tipe boolean, jadi TINYINT(1) menjadi INTEGER dan setiap nilai tetap apa adanya.

Bagaimana dengan stored procedure dan trigger?

Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri. ON UPDATE CURRENT_TIMESTAMP adalah pengecualian: menjadi trigger SQLite.

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.