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.
Đã chuyển đổi 18 hàng, 8 bản sửa, không hàng nào bị từ chối
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 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 hàng5
12 cột 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;
Bản sửa
- "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.
- "signed_up" của customers giờ cho phép NULL: một số giá trị không lưu được và là NULL.
- 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.
- "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.
- "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.
- "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.
- 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.
- "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 MariaDB | Trong SQLite | Dòng báo cáo |
|---|---|---|
| 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à 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 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 đó. | 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 NULL | bỏ 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 |
| TIME | vă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. | |
| YEAR | INTEGER 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ề. | |
| DATETIME | DATETIME 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. | |
| 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ê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 |
| 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é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 list | khô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 |
| SET | TEXT như MySQL ghi ('a,b')SQLite không có mảng; văn bản là chuỗi MySQL trả về. | |
| JSON | TEXTHà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ệ. | 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_INCREMENT | INTEGER 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 one | INTEGER 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_TIMESTAMP | mộ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 columns | GENERATED 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 lacks | mộ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 columns | cộ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 lacks | khô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 ENFORCED | khô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 lacks | khô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 indexes | khô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 indexes | khô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 write | khô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 keys | trong 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 key | khô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 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ù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, BLOB | BLOBByte vẫn là byte. | |
| PARTITION BY | mộ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 engines | bảng thườngSQLite có một engine bảng duy nhất. | engine_dropped |
| dumps of several databases | mộ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 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ị. | 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. | geometry_as_blob |
| _ci collations | so 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 rows | NULLTrì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 VALUES | giá 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 default | NULLKhông có giá trị nào để sao chép. | default_keyword_null |
| REPLACE and INSERT IGNORE | hà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 know | TEXTVă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 column | NULLBả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 geometries | NULLByte 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.sqlKhó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ố.