Navicat迁移SQLite至MySQL需先建两独立连接,删SQLite索引,数据传输时禁用结构同步并注意字段类型映射与SQL模式兼容性,失败时可用CSV中转。
Navicat 连接 SQLite 和 MySQL 是前提
navicat 本身不支持直接拖拽 .nb3 或 .db 文件进 mysql,必须先建立两个独立连接:一个指向 sqlite 文件(路径需是本地绝对路径,如 d:\pboot\data\database.db),另一个指向已创建的空 mysql 数据库(例如 pboot_mysql)。连接 sqlite 时,类型选 sqlite,文件路径填对即可;mysql 连接则需填主机、端口、用户名、密码,确保能连通。
数据传输前必须删掉 SQLite 的索引
这是最容易卡住的一步。Navicat 的「数据传输」功能在遇到 SQLite 的 CREATE INDEX 语句时会报错中断,尤其是带 UNIQUE 或复合索引的表。不是忽略错误,而是得提前清理:
- 在 Navicat 中右键 SQLite 连接 →「数据库对象」→ 展开「索引」→ 全选 → 右键「删除」
- 或者用命令行进 SQLite 执行:
sqlite3 your.db "SELECT 'DROP INDEX ' || name || ';' FROM sqlite_master WHERE type = 'index';" | sqlite3 your.db - 删完再刷新连接,确认索引列表为空,否则传输中途大概率失败
用「数据传输」功能但要关掉「结构同步」
选中 SQLite 连接 → 右键 →「数据传输」→ 左侧选源,右侧选目标 MySQL 库 → 下一步 → 在「选项」页里关键设置:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 勾选「仅传输数据」,取消勾选「同步结构」——因为 SQLite 的
INTEGER PRIMARY KEY AUTOINCREMENT无法被 MySQL 直接识别,Navicat 自动生成的建表语句常漏掉AUTO_INCREMENT或写错类型 - 字段映射不用手动调,但注意检查:SQLite 的
TEXT字段若实际存长文本(如文章内容),MySQL 目标列得设成MEDIUMTEXT而非默认VARCHAR(255),否则截断 - 传输前确认 MySQL 的
sql-mode不含STRICT_TRANS_TABLES,否则遇到空字符串往INT列插会报错#1366;修改my.ini后务必重启 MySQL
导出 CSV 再导入是更稳的备选路径
如果「数据传输」反复失败(尤其字段含逗号、换行、中文乱码),就绕过 SQL 中转,走 CSV:
- 在 SQLite 连接里右键表 →「导出向导」→ 格式选
CSV→ 编码选UTF-8→ 勾选「首行为列名」→ 分隔符用逗号,但若字段本身含逗号,改用制表符\t更安全 - MySQL 端新建同名表(主键、类型、长度手动对齐),再右键目标表 →「导入向导」→ 选刚导出的 CSV → 编码选
UTF-8→ 分隔符匹配导出设置 →「数据行从第 2 行开始」 - 布尔字段(如
status)SQLite 存1/0或TRUE/FALSE,MySQL 要对应TINYINT(1),导入前用文本编辑器把 CSV 里的TRUE全替成1,FALSE替成0
真正麻烦的从来不是工具按钮在哪,而是 SQLite 的隐式类型和 MySQL 的严格模式之间那几处不声不响的 mismatch —— 比如空字符串塞进数字列、默认值缺失、主键没设自增。动手前先看一眼 PRAGMA table_info(your_table),比盲目点「开始」省三小时。

















