---
title: "Chuyển MySQL sang SQLite trên trình duyệt"
description: "Di chuyển cơ sở dữ liệu MySQL hoặc MariaDB sang SQLite: chuyển bản dump thành tập lệnh cùng bảng, khóa và dữ liệu, kèm báo cáo mọi thay đổi."
canonical: https://intosql.com/vi/mysql-sang-sqlite
last_updated: 2026-10-15
---

# Chuyển MySQL sang SQLite trên trình duyệt

Thả bản dump từ mysqldump, mariadb-dump, mysqlpump, 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.

[Hướng dẫn di chuyển MySQL sang SQLite](https://intosql.com/docs/migrations/mysql-to-sqlite)

[Kiểu dữ liệu từ MySQL sang SQLite](https://intosql.com/docs/types/mysql-to-sqlite)

## Những gì thay đổi từ MySQL 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.

| Trong MySQL | Trong SQLite | Dòng báo cáo |
| --- | --- | --- |
| TINYINT(1), BOOL | INTEGER, giữ nguyên giá trị |  |
| UNSIGNED integers | INTEGER kèm CHECK không âm; BIGINT UNSIGNED chứa giá trị trên 2^63-1 là TEXT | `unsigned_widened` |
| ZEROFILL and display widths | bị bỏ | `zerofill_dropped` |
| FLOAT(M,D) | REAL, bỏ số chữ số thập phân cố định | `float_scale_dropped` |
| DECIMAL(p,s) | DECIMAL(p,s) đến 15 chữ số; vượt quá thì TEXT | `decimal_as_text` |
| BIT(1), BIT(n) | INTEGER với giá trị của các bit; BIT(64) dạng chữ số TEXT |  |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULL | `invalid_date_null` |
| NOT NULL columns with values that become NULL | bỏ NOT NULL | `not_null_relaxed` |
| DEFAULT '0000-00-00' | không có giá trị mặc định | `zero_date_default` |
| TIME | văn bản TIME như MySQL ghi, kể cả khoảng thời gian |  |
| YEAR | INTEGER kèm CHECK phạm vi |  |
| CHAR(n), VARCHAR(n) | VARCHAR(n), không ràng buộc độ dài |  |
| DATETIME | DATETIME dạng văn bản ISO 8601 |  |
| 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_zone_assumed` |
| ENUM | TEXT kèm CHECK 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 | `enum_invalid_value` |
| ENUM holding values outside its list | không có CHECK | `enum_check_skipped` |
| SET | TEXT như MySQL ghi ('a,b') |  |
| JSON | TEXT |  |
| NUL bytes in text | được giữ |  |
| text that isn't valid in its character set | byte lỗi thành ký tự thay thế | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | sao chép nguyên trạng | `mojibake_suspected` |
| AUTO_INCREMENT | INTEGER PRIMARY KEY AUTOINCREMENT, bộ đếm đặt sau các id đã sao chép |  |
| AUTO_INCREMENT on part of a key or outside one | INTEGER không có bộ đếm | `identity_without_counter` |
| ON UPDATE CURRENT_TIMESTAMP | một trình kích hoạt AFTER UPDATE | `on_update_trigger` |
| generated columns | GENERATED ALWAYS AS, VIRTUAL hoặc STORED như trong nguồn |  |
| generated columns with functions SQLite lacks | một cột thường | `generated_not_translated` |
| INVISIBLE columns | cột thường | `invisible_column` |
| CHECK constraints | được chuyển đổi, viết trực tiếp trong CREATE TABLE |  |
| CHECK constraints with functions SQLite lacks | không được tạo | `check_skipped` |
| CHECK ... NOT ENFORCED | không được tạo | `check_not_enforced` |
| defaults with functions SQLite lacks | không có giá trị mặc định | `default_not_translated` |
| keys and indexes on a prefix, c(20) | chỉ mục trên substr(c, 1, 20) | `prefix_unique` |
| FULLTEXT indexes | không được tạo | `fulltext_not_created` |
| SPATIAL indexes | không được tạo | `spatial_index_not_created` |
| functional indexes SQLite can't write | không được tạ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 |  |
| foreign keys to columns without a unique key | không được tạ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 | `identifier_renamed` |
| GEOMETRY, POINT, POLYGON... | WKB trong BLOB | `geometry_as_blob` |
| INET4, INET6, UUID (MariaDB) | TEXT |  |
| BINARY, VARBINARY, BLOB | BLOB |  |
| PARTITION BY | một bảng | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | bảng chứa các hàng hiện tại | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | bảng thường | `engine_dropped` |
| dumps of several databases | một tệp, mỗi bảng có tên cơ sở dữ liệu ở đầu | `databases_merged` |
| views, triggers, procedures, functions and events | được liệt kê trong báo cáo | `not_converted_objects` |
| dumps without CREATE TABLE | kiểu suy ra từ giá trị | `no_schema` |
| geometries in a dump without CREATE TABLE | WKB trong BLOB | `geometry_as_blob` |
| _ci collations | so sánh chính xác | `case_insensitive_collation` |
| SET NAMES utf8 from utf8mb4 tables | được chuyển đổi, kèm cảnh bá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) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | đọc dưới dạng UTF-8, kèm cảnh báo | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | được tính ra giá trị |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | giá trị mặc định của cột | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | hàng thường | `replace_as_insert` |
| types IntoSQL doesn't know | TEXT | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| CREATE SEQUENCE (MariaDB) | không được tạo | `sequence_not_converted` |
| VECTOR(n) (MariaDB 11.7+) | TEXT với các số thực dưới dạng mảng JSON | `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.

```shell
sqlite3 -bail mydb.sqlite < mysql.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 MySQL để 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, những ký tự mà bản dump utf8 làm mất trước khi trình chuyển đổi thấy.
- --hex-blob ghi cột nhị phân 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 từng cơ sở dữ liệu. 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ề MySQL sang SQLite

### 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.

### Nó có đọc được bản dump MariaDB không?

Có. Bản dump từ mariadb-dump và từ MariaDB 10.3 đến 12 được chuyển đổi theo cùng cách, kể cả các cột INET6, INET4 và UUID của MariaDB.

### Ngày 0000-00-00 sẽ ra sao?

Chúng trở thành NULL: SQLite có thể lưu văn bản, nhưng không gì đọc 0000-00-00 như một ngày. Báo cáo cho biết số lượng trong mỗi cột.

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

Có. Cột AUTO_INCREMENT là toàn bộ khóa chính của bảng trở thành INTEGER PRIMARY KEY AUTOINCREMENT, mọi hàng giữ id của nó, và id tiếp theo tiếp tục sau id lớn nhất. Các cột AUTO_INCREMENT khác giữ giá trị mà không có bộ đếm, và báo cáo ghi rõ điều đó.

### TINYINT(1) có thành boolean không?

Không. SQLite không có kiểu boolean, nên TINYINT(1) là INTEGER và mọi giá trị giữ nguyên.

### 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. ON UPDATE CURRENT_TIMESTAMP là ngoại lệ: nó trở thành một trình kích hoạt SQLite.

### 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ố.

## Từ MySQL

- [MySQL sang PostgreSQL](https://intosql.com/vi/mysql-sang-postgresql)
- [MySQL sang MySQL](https://intosql.com/vi/mysql-sang-mysql)
- [MySQL sang MariaDB](https://intosql.com/vi/mysql-sang-mariadb)
- [MySQL sang SQL Server](https://intosql.com/vi/mysql-sang-sql-server)
- [MySQL sang Oracle](https://intosql.com/vi/mysql-sang-oracle)

## Sang SQLite

- [MariaDB sang SQLite](https://intosql.com/vi/mariadb-sang-sqlite)
- [PostgreSQL sang SQLite](https://intosql.com/vi/postgresql-sang-sqlite)
- [SQL Server sang SQLite](https://intosql.com/vi/sql-server-sang-sqlite)
- [SQLite sang SQLite](https://intosql.com/vi/sqlite-sang-sqlite)
- [Oracle sang SQLite](https://intosql.com/vi/oracle-sang-sqlite)

## Hướng dẫn và mọi cặp

- [SQLite sang MySQL](https://intosql.com/vi/sqlite-sang-mysql)
- [Hướng dẫn di chuyển MySQL sang SQLite](https://intosql.com/docs/migrations/mysql-to-sqlite)
- [Kiểu dữ liệu từ MySQL sang SQLite](https://intosql.com/docs/types/mysql-to-sqlite)
- [Mọi cặp cơ sở dữ liệu](https://intosql.com/vi/chuyen-co-so-du-lieu)
