---
title: "将 SQLite 数据库迁移到另一个版本"
description: "将 SQLite .db 文件或转储转换为可在 SQLite 3.31 及以上导入的脚本，表、键和数据相同，并报告每项更改。"
canonical: https://intosql.com/zh-cn/sqlite-to-sqlite
last_updated: 2026-10-15
---

# 将 SQLite 数据库迁移到另一个版本

拖入 SQLite 数据库文件 (.db、.sqlite、.sqlite3) 或 sqlite3 的 .dump 写出的 SQL，即可下载可在 SQLite 3.31 及以上导入的脚本。每列保留声明的类型和排序规则，并去掉 STRICT 以便旧版本接受这些表，每项更改都会列在报告中。

[SQLite 到 SQLite 迁移指南](https://intosql.com/docs/migrations/sqlite-to-sqlite)

[SQLite 到 SQLite 的数据类型](https://intosql.com/docs/types/sqlite-to-sqlite)

## 文件与脚本之间的变化

每一行是转换器应用的一条规则，以及该规则更改你的数据时在报告中写入的记录。

| 文件中 | 脚本中 | 报告记录 |
| --- | --- | --- |
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | 列中每个值都符合的类型 |  |
| BOOLEAN, BOOL | INTEGER 0 或 1，并带有 CHECK |  |
| TEXT, VARCHAR(n), CHAR(n), CLOB | 声明的类型，按原样保留 |  |
| DECIMAL(p,s), NUMERIC | 每个值都符合时为精确类型，否则为 double |  |
| BLOB, and columns holding bytes | BLOB |  |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | DATE、DATETIME，以 ISO 8601 文本存储 |  |
| JSON holding JSON text | TEXT |  |
| Infinity in REAL columns | 9e999，即 SQLite 自己的无穷大 |  |
| INTEGER PRIMARY KEY, AUTOINCREMENT | INTEGER PRIMARY KEY，保留 AUTOINCREMENT |  |
| COLLATE NOCASE | COLLATE NOCASE |  |
| generated columns | 生成列，与源数据一样为 STORED 或 VIRTUAL |  |
| generated columns with functions IntoSQL doesn't write, and the || operator | 普通列 | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | 无默认值 | `default_not_translated` |
| CHECK constraints | 已转换 |  |
| CHECK constraints with functions IntoSQL doesn't write | 不创建 | `check_skipped` |
| partial and expression indexes | 不创建 | `index_skipped` |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | 相同的外键，可用 PRAGMA foreign_key_check 列出 |  |
| foreign keys to tables the dump doesn't create | 不创建 | `foreign_key_skipped` |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | 去除 NOT NULL | `not_null_relaxed` |
| views, triggers and virtual tables (FTS, R*Tree) | 在报告中列出 | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | 根据值推断类型 | `no_schema` |
| expressions in INSERT values other than the text functions dumps write | NULL | `expression_value` |
| NUL characters in text | 保留 |  |
| text that isn't valid UTF-8 | 错误的字节变为替换字符 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 按原样复制 | `mojibake_suspected` |

## 将脚本导入 SQLite

脚本先创建表、复制行，再添加键、索引和外键，因此导入速度快，并会在遇到第一个错误时停止。

```shell
sqlite3 -bail mydb.sqlite < sqlite.sqlite.sql
```

外键在每个表中声明，行在关闭外键检查的情况下导入。随后脚本会列出所有指向不存在的行的行，而不是中途失败。

对于较大的转储，请导入到本地磁盘上的新文件中。脚本在关闭同步的单个事务中导入全部内容，因此以磁盘速度运行，中途停止的导入也不会留下不完整的表。

命令行可将文件直接导入 SQLite 数据库，无需生成脚本，而且免费。

## 如何转储 SQLite 以获得最佳结果

转换器读取转储中的内容。以下选项能让转储保留更多数据：

- 数据库文件本身会原样转换，在浏览器中逐页读取。请先关闭正在写入它的应用，以免有更改遗留在其 -wal 文件中。
- sqlite3 app.db .dump > app.sql 会将同一个数据库写为 SQL，它同样可以转换，格式为 .sql 或 .sql.gz。
- DB Browser for SQLite 通过 File、Export、Database to SQL file 也能写出该 SQL，Python 的 iterdump() 也一样。

## 哪些内容不会转换

视图、触发器、存储过程、函数等用 SQLite 自己的语言编写的对象，会按名称列在报告中，绝不会被悄悄丢弃，你可以先在要导入的 SQLite 版本上逐一检查再重建。

## 关于在 SQLite 版本之间迁移的问题

### 我的转储会被上传吗？

不会。转换器在你的浏览器中运行，分块从磁盘读取转储，因此转储不会离开你的电脑。桌面应用和命令行也在你的电脑上转换。

### 转储可以多大？

转换器从不把整个转储放进内存：它按范围读取文件两次，边读边写出脚本。几 GB 的转储可以在浏览器、桌面应用和命令行中转换。

### 可以直接转换 .db 文件吗？

可以。拖入 .db、.sqlite 或 .sqlite3 文件：它在浏览器中读取，绝不会上传。含 NUL 字符的文本和 double 值的每一位数字都会按存储原样保留，而 .dump 可能会将其截断。

### 转储可以来自哪些 SQLite 版本？

SQLite 3.0 及更高版本的 UTF-8 或 UTF-16 数据库文件，以及由 sqlite3 shell 的 .dump 或 Python 的 iterdump() 写出的转储。每个测试文件和转储都来自 sqlite3 3.31 到 3.54，包括 STRICT 和 WITHOUT ROWID 表，并与其源数据逐个单元格比较。

### SQLite 不强制类型时，列类型如何确定？

每列保留其声明的类型，COLLATE NOCASE 和 RTRIM 也是如此。STRICT 会被去掉，因此脚本可以在 3.31 起的每个版本上导入。

### INTEGER PRIMARY KEY 和 AUTOINCREMENT 会保留吗？

会。INTEGER PRIMARY KEY 和 AUTOINCREMENT 保持不变，sqlite_sequence 从转储时的位置继续。

### 视图和触发器怎么处理？

它们会按名称在报告中列出，但不会转换，以便你在导入表之后重新创建它们。

### 脚本可以导入哪些 SQLite 版本？

SQLite 3.31 及更高版本。每个测试文件和转储都能在 3.31 和 3.54 上导入，如有问题会在第一个错误处停止。

## 从 SQLite

- [SQLite 到 PostgreSQL](https://intosql.com/zh-cn/sqlite-to-postgresql)
- [SQLite 到 MySQL](https://intosql.com/zh-cn/sqlite-to-mysql)
- [SQLite 到 MariaDB](https://intosql.com/zh-cn/sqlite-to-mariadb)
- [SQLite 到 SQL Server](https://intosql.com/zh-cn/sqlite-to-sql-server)
- [SQLite 到 Oracle](https://intosql.com/zh-cn/sqlite-to-oracle)

## 到 SQLite

- [MySQL 到 SQLite](https://intosql.com/zh-cn/mysql-to-sqlite)
- [MariaDB 到 SQLite](https://intosql.com/zh-cn/mariadb-to-sqlite)
- [PostgreSQL 到 SQLite](https://intosql.com/zh-cn/postgresql-to-sqlite)
- [SQL Server 到 SQLite](https://intosql.com/zh-cn/sql-server-to-sqlite)
- [Oracle 到 SQLite](https://intosql.com/zh-cn/oracle-to-sqlite)

## 指南和所有组合

- [SQLite 到 SQLite 迁移指南](https://intosql.com/docs/migrations/sqlite-to-sqlite)
- [SQLite 到 SQLite 的数据类型](https://intosql.com/docs/types/sqlite-to-sqlite)
- [所有数据库组合](https://intosql.com/zh-cn/database-migration)
