Navicat 17 不支持直接导入 SQL Server 的 .bak 文件,因其底层无 SQL Server 备份解析引擎,仅能通过 ODBC/OLE DB 连接运行中的实例进行数据迁移。

Navicat 17 不支持直接导入 SQL Server 的 .bak 文件 —— 必须先还原到一个可连接的 SQL Server 实例,再通过 ODBC 连接迁移。
为什么不能直接读取 .bak 文件
SQL Server 的 .bak 是二进制备份格式,Navicat(包括 17 版)底层不包含 SQL Server 备份解析引擎。它只支持通过数据库驱动(如 OLE DB 或 ODBC)实时连接并读取运行中的数据库,而非离线文件。
-
.bak文件必须先用 SQL Server Management Studio(SSMS)或RESTORE DATABASE命令还原到本地或局域网内某台 SQL Server 实例上 - 若还原目标是 Express 版本,请确认实例名是否带
SQLEXPRESS,Navicat 连接时服务器名需写全(例如localhostSQLEXPRESS) - Windows 防火墙常拦截远程连接,建议临时关闭,或放行 SQL Server 的 TCP 端口(默认 1433)
Navicat 17 中配置 ODBC 连接 SQL Server 的关键步骤
Navicat 17 已移除旧版“导入向导 → ODBC”路径,改用更统一的 数据传输 功能,但底层仍依赖系统 DSN 或原生提供程序。
- 确保已安装
Microsoft OLE DB Driver for SQL Server(新版,非已弃用的 SQLOLEDB) - 在 Navicat 中右键目标 MySQL 数据库 → 选择
数据传输→ 源类型选ODBC→ 点击设置连接 - 连接字符串示例:
Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=YourDB;Trusted_Connection=yes;(Windows 认证) - 若用 SQL 账号,把
Trusted_Connection=yes换成UID=sa;PWD=yourpass,并确认该账号有db_datareader权限 - 测试连接成功后,才能进入表选择界面;失败时错误多为
Named Pipes Provider, error: 40 - Could not open a connection...,本质是连不通实例
字段类型自动转换的坑与绕过方式
Navicat 17 对 SQL Server → MySQL 类型映射做了基础适配,但几个高频问题几乎必现:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
-
DATETIME2(7)会被转成DATETIME,但 MySQL 5.6 不支持小数秒精度 → 导致建表失败;需提前在 SQL Server 中用CAST(col AS DATETIME)投影处理 -
BIT字段转成TINYINT(1)后,MySQL 默认不设NOT NULL,而原字段可能是非空 → 迁移后查不到值,需手动补ALTER TABLE ... MODIFY col TINYINT(1) NOT NULL -
NVARCHAR(MAX)/TEXT映射为MEDIUMTEXT,但 Navicat 不自动加CHARSET=utf8mb4→ 中文乱码;建议在目标 MySQL 库创建时就指定CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs - 如果某张表迁移失败,不要重跑全部——右键该表 →
数据传输→ 单独重传,并勾选跳过已存在记录避免主键冲突
迁移后必须验证的三件事
Navicat 的进度条走到 100% 不代表数据一致。真正落地前至少核对:
- 源库执行
SELECT COUNT(*) FROM [table],目标库执行等价SELECT COUNT(*) FROM,两者必须完全相等(注意:Navicat 默认不迁移tableIDENTITY值,自增 ID 可能从 1 重新开始) - 抽样检查含中文、时间、浮点数的字段内容是否失真,例如 SQL Server 的
GETDATE()值在 MySQL 中是否变成0000-00-00 00:00:00 - Navicat 不迁移索引和约束(仅结构),
PRIMARY KEY和FOREIGN KEY需手动补建;否则后续应用报错Cannot add or update a child row: a foreign key constraint fails
最易被忽略的是默认值丢失:SQL Server 的 DEFAULT GETDATE() 在 MySQL 中不会自动转成 CURRENT_TIMESTAMP,必须人工修正表定义。










