Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển MariaDB sang SQLite

Thả bản dump từ mariadb-dump, mysqldump, phpMyAdmin hoặc Adminer, dạng .sql hoặc .sql.gz, và tải xuống tập lệnh SQLite với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị SQLite không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.

Tệp của bạn
sqlshop_2024_mariadb.sqlTệp mẫu, 6,6 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, 8 bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_mariadb.sqlBản dump MariaDB 11.8.9-MariaDB-ubu2404 · do mariadb-dump ghi · utf8mb4

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

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

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

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

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

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

Bản sửa

  1. "id" của customers là số không dấu, nên được chuyển thành INTEGER kèm ràng buộc kiểm tra không âm.
  2. "signed_up" của customers giờ cho phép NULL: một số giá trị không lưu được và là NULL.
  3. Giá trị mặc định của "signed_up" trong customers, 0000‑00‑00, không phải ngày SQLite chấp nhận, nên cột không có giá trị mặc định.
  4. "customer_id" của orders là số không dấu, nên được chuyển thành INTEGER kèm ràng buộc kiểm tra không âm.
  5. "id" của orders là số không dấu, nên được chuyển thành INTEGER kèm ràng buộc kiểm tra không âm.
  6. "items" của orders là số không dấu, nên được chuyển thành INTEGER kèm ràng buộc kiểm tra không âm.
  7. 1 hàng của "status" trong orders chứa giá trị rỗng mà MySQL lưu cho mục không hợp lệ; ràng buộc kiểm tra giá trị cho phép giá trị này.
  8. "updated_at" của orders đổi thành thời điểm hiện tại mỗi lần cập nhật; trong SQLite, một trình kích hoạt làm việc đó.

Cần xem lại

  • 1 sequence không được tạo; SQLite không có sequence. Hãy lưu giá trị tiếp theo trong một bảng nếu ứng dụng cần.
  • 1 giá trị trong "signed_up" của customers là ngày bằng 0 hoặc không hợp lệ, như 0000‑00‑00, mà SQLite không lưu được, nên được đặt thành NULL. Nếu các ngày đó có ý nghĩa, hãy thay chúng bằng ngày thật trong nguồn trước khi tạo bản dump.
  • Giá trị mặc định của "invoice" trong orders không viết được cho SQLite (a sequence), nên cột không có giá trị mặc định. Hãy thêm giá trị mặc định thủ công nếu hàng mới cần nó.
  • 1 giá trị trong "shipped_at" của orders là ngày bằng 0 hoặc không hợp lệ, như 0000‑00‑00 00:00:00, mà SQLite không lưu được, nên được đặt thành NULL. Nếu các ngày đó có ý nghĩa, hãy thay chúng bằng ngày thật trong nguồn trước khi tạo bản dump.

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Những gì thay đổi từ MariaDB sang SQLite

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

  • TINYINT(1), BOOL

    INTEGER, giữ nguyên giá trị

    SQLite không có kiểu boolean; true và false là các số nguyên 1 và 0, nên mọi giá trị giữ nguyên ý nghĩa.

  • UNSIGNED integers

    INTEGER kèm CHECK không âm; BIGINT UNSIGNED chứa giá trị trên 2^63-1 là TEXT

    Số nguyên SQLite là 64 bit có dấu. Ràng buộc kiểm tra chặn giá trị âm như MySQL; giá trị vượt dải có dấu được giữ dạng văn bản để không mất chữ số nào.

    Dòng báo cáo: unsigned_widened

  • ZEROFILL and display widths

    bị bỏ

    Thêm số 0 phía trước là cách hiển thị số, không phải một phần của số. Các số được giữ; hãy định dạng khi đọc nếu cần phần số 0 đó.

    Dòng báo cáo: zerofill_dropped

  • FLOAT(M,D)

    REAL, bỏ số chữ số thập phân cố định

    Số dấu phẩy động của SQLite không có số chữ số thập phân cố định. Giá trị đã lưu được sao chép nguyên trạng.

    Dòng báo cáo: float_scale_dropped

  • DECIMAL(p,s)

    DECIMAL(p,s) đến 15 chữ số; vượt quá thì TEXT

    SQLite giữ khoảng 15 chữ số có nghĩa trong một số. Số thập phân rộng hơn được giữ dạng văn bản để mọi chữ số đều chính xác.

    Dòng báo cáo: decimal_as_text

  • BIT(1), BIT(n)

    INTEGER với giá trị của các bit; BIT(64) dạng chữ số TEXT

    Trường bit được lưu thành số do các bit của nó tạo nên. Bit cao nhất của BIT(64) không vừa số nguyên có dấu, nên số của nó được giữ dạng văn bản.

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

    NULL

    Hàm ngày của SQLite chỉ đọc ngày có thật trên lịch. Chúng trở thành NULL và báo cáo đếm số lượng, như với mọi cơ sở dữ liệu khác.

    Dòng báo cáo: invalid_date_null

  • NOT NULL columns with values that become NULL

    bỏ NOT NULL

    Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.

    Dòng báo cáo: not_null_relaxed

  • DEFAULT '0000-00-00'

    không có giá trị mặc định

    Giá trị mặc định không phải ngày có thật sẽ bị bỏ, thay vì thay bằng một ngày bịa ra.

    Dòng báo cáo: zero_date_default

  • TIME

    văn bản TIME như MySQL ghi, kể cả khoảng thời gian

    SQLite giữ thời gian dạng văn bản, nên khoảng thời gian dài hơn một ngày hoặc âm được giữ chính xác.

  • YEAR

    INTEGER kèm CHECK phạm vi

    SQLite không có kiểu năm; ràng buộc kiểm tra giữ đúng các giá trị MySQL cho phép.

  • CHAR(n), VARCHAR(n)

    VARCHAR(n), không ràng buộc độ dài

    SQLite giữ kiểu đã khai báo cho công cụ đọc nhưng không giới hạn độ dài; giá trị là những gì MySQL trả về.

  • DATETIME

    DATETIME dạng văn bản ISO 8601

    SQLite lưu ngày dạng văn bản mà các hàm ngày của nó đọc được.

  • TIMESTAMP

    TIMESTAMP dạng văn bản ISO 8601 theo UTC; theo múi giờ bản dump nêu, UTC khi không nêu

    TIMESTAMP là một thời điểm, được ghi theo UTC. Bản dump nêu múi giờ đã dùng khi ghi (mysqldump ghi UTC); nếu không, giá trị được đọc theo UTC và báo cáo ghi rõ điều đó.

    Dòng báo cáo: timestamp_zone_assumed

  • ENUM

    TEXT kèm CHECK các giá trị

    Văn bản kèm ràng buộc kiểm tra giữ đúng các giá trị.

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

    giá trị rỗng được ràng buộc kiểm tra cho phép

    MySQL lưu chuỗi rỗng khi một giá trị không hợp lệ được ghi vào ENUM ở chế độ SQL không nghiêm ngặt. Các hàng đó được giữ và ràng buộc kiểm tra cho phép chúng.

    Dòng báo cáo: enum_invalid_value

  • ENUM holding values outside its list

    không có CHECK

    Giá trị không có trong danh sách sẽ vi phạm ràng buộc kiểm tra, nên ràng buộc không được tạo.

    Dòng báo cáo: enum_check_skipped

  • SET

    TEXT như MySQL ghi ('a,b')

    SQLite không có mảng; văn bản là chuỗi MySQL trả về.

  • JSON

    TEXT

    Hàm JSON của SQLite đọc JSON từ văn bản. Cột khai báo JSON sẽ biến "123" thành số, nên dùng TEXT.

  • NUL bytes in text

    được giữ

    Văn bản SQLite chứa được byte NUL, nên giá trị được sao chép nguyên trạng.

  • text that isn't valid in its character set

    byte lỗi thành ký tự thay thế

    Văn bản SQLite là UTF-8; các hàm của nó đọc sai byte không hợp lệ.

    Dòng báo cáo: invalid_utf8_replaced

  • text decoded twice (ñ)

    sao chép nguyên trạng

    Bản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.

    Dòng báo cáo: mojibake_suspected

  • AUTO_INCREMENT

    INTEGER PRIMARY KEY AUTOINCREMENT, bộ đếm đặt sau các id đã sao chép

    SQLite đếm một khóa chính số nguyên trọn vẹn. AUTOINCREMENT ngăn dùng lại id, như MySQL, và bộ đếm tiếp tục sau id lớn nhất hoặc AUTO_INCREMENT của bản dump, tùy giá trị nào lớn hơn.

  • AUTO_INCREMENT on part of a key or outside one

    INTEGER không có bộ đếm

    SQLite chỉ đếm cột là toàn bộ khóa chính, nên cột giữ giá trị của nó và hàng mới cần tự có giá trị.

    Dòng báo cáo: identity_without_counter

  • ON UPDATE CURRENT_TIMESTAMP

    một trình kích hoạt AFTER UPDATE

    Trình kích hoạt đặt cột thành thời điểm hiện tại khi một hàng thay đổi mà lệnh cập nhật không đặt nó, như MySQL.

    Dòng báo cáo: on_update_trigger

  • generated columns

    GENERATED ALWAYS AS, VIRTUAL hoặc STORED như trong nguồn

    SQLite 3.31 trở lên tính cột tính toán theo cùng hai cách.

  • generated columns with functions SQLite lacks

    một cột thường

    Công thức không viết được cho SQLite để lại một cột thường và một dòng trong báo cáo.

    Dòng báo cáo: generated_not_translated

  • INVISIBLE columns

    cột thường

    SQLite không có cột ẩn.

    Dòng báo cáo: invisible_column

  • CHECK constraints

    được chuyển đổi, viết trực tiếp trong CREATE TABLE

    SQLite chỉ nhận ràng buộc kiểm tra trong CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    không được tạo

    Ràng buộc kiểm tra không viết được cho SQLite sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: check_skipped

  • CHECK ... NOT ENFORCED

    không được tạo

    MySQL giữ các ràng buộc kiểm tra này nhưng không áp dụng, nên các hàng có thể vi phạm chúng.

    Dòng báo cáo: check_not_enforced

  • defaults with functions SQLite lacks

    không có giá trị mặc định

    Giá trị mặc định không viết được cho SQLite sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: default_not_translated

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

    chỉ mục trên substr(c, 1, 20)

    SQLite lập chỉ mục trên biểu thức, nên cùng phần tiền tố được lập chỉ mục và tiền tố duy nhất vẫn duy nhất.

    Dòng báo cáo: prefix_unique

  • FULLTEXT indexes

    không được tạo

    SQLite tìm kiếm văn bản bằng các bảng FTS5 riêng, cần truy vấn riêng.

    Dòng báo cáo: fulltext_not_created

  • SPATIAL indexes

    không được tạo

    SQLite không có chỉ mục không gian trên cột.

    Dòng báo cáo: spatial_index_not_created

  • functional indexes SQLite can't write

    không được tạo

    Chỉ mục trên biểu thức không viết được cho SQLite sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: index_skipped

  • foreign keys

    trong CREATE TABLE, nạp không kiểm tra, rồi liệt kê bằng PRAGMA foreign_key_check

    SQLite chỉ nhận khóa ngoại trong CREATE TABLE và chỉ kiểm tra khi bật PRAGMA foreign_keys. Các hàng được nạp không kiểm tra, như từ MySQL, và tập lệnh kết thúc bằng việc liệt kê mọi hàng không có hàng cha.

  • foreign keys to columns without a unique key

    không được tạo

    SQLite cần khóa duy nhất trên các cột được tham chiếu; InnoDB thì không.

    Dòng báo cáo: foreign_key_skipped

  • table, index and column names

    như đã viết; đổi tên khi chỉ khác nhau về hoa thường hoặc khi tên chỉ mục bị trùng

    Tên trong SQLite không phân biệt hoa thường, và tên chỉ mục dùng chung một không gian tên cho mỗi cơ sở dữ liệu.

    Dòng báo cáo: identifier_renamed

  • GEOMETRY, POINT, POLYGON...

    WKB trong BLOB

    Định dạng nhị phân chuẩn well-known binary giữ chính xác mọi dữ liệu hình học.

    Dòng báo cáo: geometry_as_blob

  • INET4, INET6, UUID (MariaDB)

    TEXT

    SQLite không có các kiểu này; văn bản là chuỗi MariaDB trả về.

  • BINARY, VARBINARY, BLOB

    BLOB

    Byte vẫn là byte.

  • PARTITION BY

    một bảng

    Các hàng giữ nguyên.

    Dòng báo cáo: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    bảng chứa các hàng hiện tại

    Bản dump chỉ chứa các hàng hiện tại.

    Dòng báo cáo: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    bảng thường

    SQLite có một engine bảng duy nhất.

    Dòng báo cáo: engine_dropped

  • dumps of several databases

    một tệp, mỗi bảng có tên cơ sở dữ liệu ở đầu

    Một tệp SQLite là một cơ sở dữ liệu, nên tên cơ sở dữ liệu giúp phân biệt các bảng trùng tên.

    Dòng báo cáo: databases_merged

  • views, triggers, procedures, functions and events

    được liệt kê trong báo cáo

    Mã của chúng viết bằng ngôn ngữ của MySQL, nên được liệt kê để bạn tạo lại.

    Dòng báo cáo: not_converted_objects

  • dumps without CREATE TABLE

    kiểu suy ra từ giá trị

    Bản dump tạo với --no-create-info chỉ có các hàng, nên kiểu được suy ra từ giá trị.

    Dòng báo cáo: no_schema

  • geometries in a dump without CREATE TABLE

    WKB trong BLOB

    Định dạng hình học của MySQL được nhận diện từ giá trị và lưu dưới dạng WKB chuẩn.

    Dòng báo cáo: geometry_as_blob

  • _ci collations

    so sánh chính xác

    SQLite so sánh văn bản chính xác, trừ khi được chỉ định khác, và NOCASE của nó chỉ quy đổi chữ cái ASCII.

    Dòng báo cáo: case_insensitive_collation

  • SET NAMES utf8 from utf8mb4 tables

    được chuyển đổi, kèm cảnh báo

    mysqldump của MySQL 5.x mặc định ghi utf8 3 byte và thay mọi emoji bằng dấu chấm hỏi trước khi bất kỳ trình chuyển đổi nào thấy tệp.

    Dòng báo cáo: dump_lost_four_byte_chars

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

    đọc dưới dạng Latin-1 (Windows-1252)

    latin1 của MySQL là Windows-1252, bảng mã thường gặp của những bản dump như vậy.

    Dòng báo cáo: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    đọc dưới dạng UTF-8, kèm cảnh báo

    Các bảng mã này chưa được giải mã.

    Dòng báo cáo: unsupported_charset

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

    được tính ra giá trị

    Một số công cụ dump ghi giá trị dưới dạng các lệnh gọi này; chúng được đọc thành giá trị mà chúng tạo ra, với WKT địa lý được chuyển sang kinh độ trước.

  • other expressions in rows

    NULL

    Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.

    Dòng báo cáo: expression_value

  • DEFAULT in VALUES

    giá trị mặc định của cột

    Giá trị mặc định dạng hằng được sao chép vào hàng.

    Dòng báo cáo: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Không có giá trị nào để sao chép.

    Dòng báo cáo: default_keyword_null

  • REPLACE and INSERT IGNORE

    hàng thường

    Bản dump có một hàng cho mỗi khóa, nên các hàng vẫn giống nhau.

    Dòng báo cáo: replace_as_insert

  • types IntoSQL doesn't know

    TEXT

    Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.

    Dòng báo cáo: unknown_type

  • values that don't fit their column

    NULL

    Bản dump bị hỏng hoặc viết tay có thể chứa giá trị mà cột không chứa được; chúng trở thành NULL để phần còn lại được nạp.

    Dòng báo cáo: invalid_value_null

  • unreadable geometries

    NULL

    Byte không phải dữ liệu hình học thì không lưu được dưới dạng hình học.

    Dòng báo cáo: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    không được tạo

    SQLite không có sequence.

    Dòng báo cáo: sequence_not_converted

  • VECTOR(n) (MariaDB 11.7+)

    TEXT với các số thực dưới dạng mảng JSON

    SQLite không có kiểu vector; mảng JSON giữ mọi số thực.

    Dòng báo cáo: type_replaced

Trong MariaDBTrong SQLiteDòng báo cáo
TINYINT(1), BOOLINTEGER, giữ nguyên giá trịSQLite không có kiểu boolean; true và false là các số nguyên 1 và 0, nên mọi giá trị giữ nguyên ý nghĩa.
UNSIGNED integersINTEGER kèm CHECK không âm; BIGINT UNSIGNED chứa giá trị trên 2^63-1 là TEXTSố nguyên SQLite là 64 bit có dấu. Ràng buộc kiểm tra chặn giá trị âm như MySQL; giá trị vượt dải có dấu được giữ dạng văn bản để không mất chữ số nào.unsigned_widened
ZEROFILL and display widthsbị bỏThêm số 0 phía trước là cách hiển thị số, không phải một phần của số. Các số được giữ; hãy định dạng khi đọc nếu cần phần số 0 đó.zerofill_dropped
FLOAT(M,D)REAL, bỏ số chữ số thập phân cố địnhSố dấu phẩy động của SQLite không có số chữ số thập phân cố định. Giá trị đã lưu được sao chép nguyên trạng.float_scale_dropped
DECIMAL(p,s)DECIMAL(p,s) đến 15 chữ số; vượt quá thì TEXTSQLite giữ khoảng 15 chữ số có nghĩa trong một số. Số thập phân rộng hơn được giữ dạng văn bản để mọi chữ số đều chính xác.decimal_as_text
BIT(1), BIT(n)INTEGER với giá trị của các bit; BIT(64) dạng chữ số TEXTTrường bit được lưu thành số do các bit của nó tạo nên. Bit cao nhất của BIT(64) không vừa số nguyên có dấu, nên số của nó được giữ dạng văn bản.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLHàm ngày của SQLite chỉ đọc ngày có thật trên lịch. Chúng trở thành NULL và báo cáo đếm số lượng, như với mọi cơ sở dữ liệu khác.invalid_date_null
NOT NULL columns with values that become NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
DEFAULT '0000-00-00'không có giá trị mặc địnhGiá trị mặc định không phải ngày có thật sẽ bị bỏ, thay vì thay bằng một ngày bịa ra.zero_date_default
TIMEvăn bản TIME như MySQL ghi, kể cả khoảng thời gianSQLite giữ thời gian dạng văn bản, nên khoảng thời gian dài hơn một ngày hoặc âm được giữ chính xác.
YEARINTEGER kèm CHECK phạm viSQLite không có kiểu năm; ràng buộc kiểm tra giữ đúng các giá trị MySQL cho phép.
CHAR(n), VARCHAR(n)VARCHAR(n), không ràng buộc độ dàiSQLite giữ kiểu đã khai báo cho công cụ đọc nhưng không giới hạn độ dài; giá trị là những gì MySQL trả về.
DATETIMEDATETIME dạng văn bản ISO 8601SQLite lưu ngày dạng văn bản mà các hàm ngày của nó đọc được.
TIMESTAMPTIMESTAMP dạng văn bản ISO 8601 theo UTC; theo múi giờ bản dump nêu, UTC khi không nêuTIMESTAMP là một thời điểm, được ghi theo UTC. Bản dump nêu múi giờ đã dùng khi ghi (mysqldump ghi UTC); nếu không, giá trị được đọc theo UTC và báo cáo ghi rõ điều đó.timestamp_zone_assumed
ENUMTEXT kèm CHECK các giá trịVăn bản kèm ràng buộc kiểm tra giữ đúng các giá trị.
ENUM holding '' (MySQL's error value)giá trị rỗng được ràng buộc kiểm tra cho phépMySQL lưu chuỗi rỗng khi một giá trị không hợp lệ được ghi vào ENUM ở chế độ SQL không nghiêm ngặt. Các hàng đó được giữ và ràng buộc kiểm tra cho phép chúng.enum_invalid_value
ENUM holding values outside its listkhông có CHECKGiá trị không có trong danh sách sẽ vi phạm ràng buộc kiểm tra, nên ràng buộc không được tạo.enum_check_skipped
SETTEXT như MySQL ghi ('a,b')SQLite không có mảng; văn bản là chuỗi MySQL trả về.
JSONTEXTHàm JSON của SQLite đọc JSON từ văn bản. Cột khai báo JSON sẽ biến "123" thành số, nên dùng TEXT.
NUL bytes in textđược giữVăn bản SQLite chứa được byte NUL, nên giá trị được sao chép nguyên trạng.
text that isn't valid in its character setbyte lỗi thành ký tự thay thếVăn bản SQLite là UTF-8; các hàm của nó đọc sai byte không hợp lệ.invalid_utf8_replaced
text decoded twice (ñ)sao chép nguyên trạngBản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.mojibake_suspected
AUTO_INCREMENTINTEGER PRIMARY KEY AUTOINCREMENT, bộ đếm đặt sau các id đã sao chépSQLite đếm một khóa chính số nguyên trọn vẹn. AUTOINCREMENT ngăn dùng lại id, như MySQL, và bộ đếm tiếp tục sau id lớn nhất hoặc AUTO_INCREMENT của bản dump, tùy giá trị nào lớn hơn.
AUTO_INCREMENT on part of a key or outside oneINTEGER không có bộ đếmSQLite chỉ đếm cột là toàn bộ khóa chính, nên cột giữ giá trị của nó và hàng mới cần tự có giá trị.identity_without_counter
ON UPDATE CURRENT_TIMESTAMPmột trình kích hoạt AFTER UPDATETrình kích hoạt đặt cột thành thời điểm hiện tại khi một hàng thay đổi mà lệnh cập nhật không đặt nó, như MySQL.on_update_trigger
generated columnsGENERATED ALWAYS AS, VIRTUAL hoặc STORED như trong nguồnSQLite 3.31 trở lên tính cột tính toán theo cùng hai cách.
generated columns with functions SQLite lacksmột cột thườngCông thức không viết được cho SQLite để lại một cột thường và một dòng trong báo cáo.generated_not_translated
INVISIBLE columnscột thườngSQLite không có cột ẩn.invisible_column
CHECK constraintsđược chuyển đổi, viết trực tiếp trong CREATE TABLESQLite chỉ nhận ràng buộc kiểm tra trong CREATE TABLE.
CHECK constraints with functions SQLite lackskhông được tạoRàng buộc kiểm tra không viết được cho SQLite sẽ bị bỏ và được báo cáo.check_skipped
CHECK ... NOT ENFORCEDkhông được tạoMySQL giữ các ràng buộc kiểm tra này nhưng không áp dụng, nên các hàng có thể vi phạm chúng.check_not_enforced
defaults with functions SQLite lackskhông có giá trị mặc địnhGiá trị mặc định không viết được cho SQLite sẽ bị bỏ và được báo cáo.default_not_translated
keys and indexes on a prefix, c(20)chỉ mục trên substr(c, 1, 20)SQLite lập chỉ mục trên biểu thức, nên cùng phần tiền tố được lập chỉ mục và tiền tố duy nhất vẫn duy nhất.prefix_unique
FULLTEXT indexeskhông được tạoSQLite tìm kiếm văn bản bằng các bảng FTS5 riêng, cần truy vấn riêng.fulltext_not_created
SPATIAL indexeskhông được tạoSQLite không có chỉ mục không gian trên cột.spatial_index_not_created
functional indexes SQLite can't writekhông được tạoChỉ mục trên biểu thức không viết được cho SQLite sẽ bị bỏ và được báo cáo.index_skipped
foreign keystrong CREATE TABLE, nạp không kiểm tra, rồi liệt kê bằng PRAGMA foreign_key_checkSQLite chỉ nhận khóa ngoại trong CREATE TABLE và chỉ kiểm tra khi bật PRAGMA foreign_keys. Các hàng được nạp không kiểm tra, như từ MySQL, và tập lệnh kết thúc bằng việc liệt kê mọi hàng không có hàng cha.
foreign keys to columns without a unique keykhông được tạoSQLite cần khóa duy nhất trên các cột được tham chiếu; InnoDB thì không.foreign_key_skipped
table, index and column namesnhư đã viết; đổi tên khi chỉ khác nhau về hoa thường hoặc khi tên chỉ mục bị trùngTên trong SQLite không phân biệt hoa thường, và tên chỉ mục dùng chung một không gian tên cho mỗi cơ sở dữ liệu.identifier_renamed
GEOMETRY, POINT, POLYGON...WKB trong BLOBĐịnh dạng nhị phân chuẩn well-known binary giữ chính xác mọi dữ liệu hình học.geometry_as_blob
INET4, INET6, UUID (MariaDB)TEXTSQLite không có các kiểu này; văn bản là chuỗi MariaDB trả về.
BINARY, VARBINARY, BLOBBLOBByte vẫn là byte.
PARTITION BYmột bảngCác hàng giữ nguyên.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)bảng chứa các hàng hiện tạiBản dump chỉ chứa các hàng hiện tại.system_versioning_dropped
MyISAM, MEMORY and other enginesbảng thườngSQLite có một engine bảng duy nhất.engine_dropped
dumps of several databasesmột tệp, mỗi bảng có tên cơ sở dữ liệu ở đầuMột tệp SQLite là một cơ sở dữ liệu, nên tên cơ sở dữ liệu giúp phân biệt các bảng trùng tên.databases_merged
views, triggers, procedures, functions and eventsđược liệt kê trong báo cáoMã của chúng viết bằng ngôn ngữ của MySQL, nên được liệt kê để bạn tạo lại.not_converted_objects
dumps without CREATE TABLEkiểu suy ra từ giá trịBản dump tạo với --no-create-info chỉ có các hàng, nên kiểu được suy ra từ giá trị.no_schema
geometries in a dump without CREATE TABLEWKB trong BLOBĐịnh dạng hình học của MySQL được nhận diện từ giá trị và lưu dưới dạng WKB chuẩn.geometry_as_blob
_ci collationsso sánh chính xácSQLite so sánh văn bản chính xác, trừ khi được chỉ định khác, và NOCASE của nó chỉ quy đổi chữ cái ASCII.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesđược chuyển đổi, kèm cảnh báomysqldump của MySQL 5.x mặc định ghi utf8 3 byte và thay mọi emoji bằng dấu chấm hỏi trước khi bất kỳ trình chuyển đổi nào thấy tệp.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8đọc dưới dạng Latin-1 (Windows-1252)latin1 của MySQL là Windows-1252, bảng mã thường gặp của những bản dump như vậy.charset_guessed
sjis, cp932, gbk, big5 dumpsđọc dưới dạng UTF-8, kèm cảnh báoCác bảng mã này chưa được giải mã.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsđược tính ra giá trịMột số công cụ dump ghi giá trị dưới dạng các lệnh gọi này; chúng được đọc thành giá trị mà chúng tạo ra, với WKT địa lý được chuyển sang kinh độ trước.
other expressions in rowsNULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.expression_value
DEFAULT in VALUESgiá trị mặc định của cộtGiá trị mặc định dạng hằng được sao chép vào hàng.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLKhông có giá trị nào để sao chép.default_keyword_null
REPLACE and INSERT IGNOREhàng thườngBản dump có một hàng cho mỗi khóa, nên các hàng vẫn giống nhau.replace_as_insert
types IntoSQL doesn't knowTEXTVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.unknown_type
values that don't fit their columnNULLBản dump bị hỏng hoặc viết tay có thể chứa giá trị mà cột không chứa được; chúng trở thành NULL để phần còn lại được nạp.invalid_value_null
unreadable geometriesNULLByte không phải dữ liệu hình học thì không lưu được dưới dạng hình học.bad_geometry
CREATE SEQUENCE (MariaDB)không được tạoSQLite không có sequence.sequence_not_converted
VECTOR(n) (MariaDB 11.7+)TEXT với các số thực dưới dạng mảng JSONSQLite không có kiểu vector; mảng JSON giữ mọi số thực.type_replaced

Nạp tập lệnh vào SQLite

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

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

Khóa ngoại được khai báo trong từng bảng và các hàng được nạp khi tắt kiểm tra khóa ngoại. Sau đó tập lệnh liệt kê mọi hàng trỏ tới hàng không tồn tại, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy nạp vào một tệp mới trên ổ đĩa cục bộ. Tập lệnh nạp mọi thứ trong một giao dịch với đồng bộ đĩa tắt, nên chạy ở tốc độ của ổ đĩa, và lần nạp dừng giữa chừng không để lại bảng dở dang.

Dòng lệnh nạp tệp thẳng vào cơ sở dữ liệu SQLite, không cần tạo tập lệnh. Hoàn toàn miễn phí.

Tạo bản dump MariaDB để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

  • --default-character-set=utf8mb4 giữ emoji và các ký tự 4 byte khác, vốn bị bản dump utf8mb3 làm mất trước khi trình chuyển đổi nhìn thấy.
  • --hex-blob ghi cột nhị phân và giá trị VECTOR dưới dạng thập lục phân, không bị hỏng khi sao chép giữa các hệ thống.
  • --routines --triggers --events thêm các đối tượng đó vào bản dump, để báo cáo có thể liệt kê chúng.

Những gì không được chuyển đổi

Khung nhìn, trình kích hoạt, thủ tục lưu trữ, hàm và sự kiện được viết bằng ngôn ngữ riêng của MariaDB. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho SQLite.

Câu hỏi về MariaDB sang SQLite

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Bản dump có thể đến từ những phiên bản MariaDB nào?

Bản dump từ mariadb-dump và mysqldump trên MariaDB 10.3 đến 12, với một INSERT mỗi bảng hoặc một INSERT mỗi hàng. Mọi bản dump thử nghiệm đến từ MariaDB 10.11, 11.4 và 11.8 và được so với nguồn từng ô một.

Cột UUID, INET6, JSON và VECTOR có được giữ không?

Cột UUID và INET thành text, JSON thành text, và VECTOR thành mảng JSON chứa các số thực của nó. Ngày bằng 0 thành NULL và báo cáo đếm chúng.

Giá trị AUTO_INCREMENT và sequence có được giữ không?

Cột AUTO_INCREMENT là toàn bộ khóa chính của bảng trở thành INTEGER PRIMARY KEY AUTOINCREMENT và tiếp tục sau id lớn nhất. SQLite không có sequence, nên chúng được ghi trong báo cáo.

Còn thủ tục lưu trữ và trình kích hoạt thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng.

Tập lệnh nạp được trên những phiên bản SQLite nào?

SQLite 3.31 trở lên. Mọi bản dump thử nghiệm đều nạp được trên 3.31 và 3.54, và dừng ở lỗi đầu tiên nếu có sự cố.