ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SQL文件导入Navicat全攻略:三种方式、编码与外键避坑指南

SQL文件导入Navicat全攻略:三种方式、编码与外键避坑指南 手里拿到一个.sql文件想把它导入 Navicat 里看看数据、跑个查询结果双击一开全是英文和密密麻麻的 INSERT 语句。再折腾一会儿导入报错、乱码、找不到表心态直接崩掉。这个操作看似简单其实门道不少。我这些年帮同事、客户处理过无数次 SQL 文件导入的问题踩过的坑比正常走通的路还多。这篇就把“如何将 sql 文件导入到 navicat 中”这件事从头到尾讲清楚包括三种不同场景的做法、每一步的细节、导入之后的校验方法以及最容易出问题的编码和外键顺序。不管你是刚接触数据库的新手还是被某个 dump 文件折磨过的老手这篇文章都能直接照着操作。1. 导入前的3个检查文件类型、编码与SQL方言拿到一个 SQL 文件先别急着打开 Navicat 点导入。花两分钟确认三件事能帮你避开 80% 的后续问题。1.1 先确认文件的出身SQL 文件本质上就是一个纯文本文件里面装的是 SQL 语句的集合比如CREATE TABLE、INSERT INTO、UPDATE等。但不同数据库导出的 SQL 文件写法差别很大MySQL 的 dump 文件通常由mysqldump工具生成开头常见-- MySQL dump注释建表语句带反引号例如CREATE TABLE \users。SQL Server 的脚本文件由 SSMS 生成建表语句用方括号[dbo].[users]可能带GO批处理分隔符。PostgreSQL 的 dump 文件常带COPY语句甚至可能是自定义格式不是纯 SQL。很多人的导入失败根源就是拿错“方言”塞进了 Navicat。比如你把 SQL Server 的脚本直接导入 MySQL 目标库不报错才怪。所以导入前一定要用文本编辑器我推荐 Notepad 或者 VS Code别用记事本Windows 自带记事本打开大文件容易卡死打开文件快速扫一眼前 50 行确认这三样东西有没有CREATE DATABASE或USE语句有的话导入后会自动切换库不需要你手动选库没有的话你必须先手动创建一个目标数据库。建表语句用的是反引号、方括号还是双引号这决定了它的“方言”。后面是INSERT INTO还是COPYCOPY是 PostgreSQL 专用MySQL 不认识。1.2 字符编码决定你是否看到乱码SQL 文件里写明了表结构但数据部分的中文、表情符号能不能正确显示完全取决于导入时选的字符集是否与文件实际编码一致。判断文件编码的方法很简单VS Code 右下角会显示当前文件的编码格式比如 UTF-8、GBK 等点击后可以选择“Reopen with Encoding”重新打开。如果打开后中文显示正常说明编码正确如果全是一堆菱形乱码“”说明你选的编码不对。我个人遇到最多的是这个组合Windows 上用旧版 MySQL 导出的文件编码是 GBK 或 GB2312而 Navicat 默认按 UTF-8 读取结果导入后中文全是乱码。1.3 分清文件类型完整备份还是纯数据最后确认这个 SQL 文件是“完整备份”包含建库、建表、索引、外键、数据还是“纯数据导出”只有 INSERT 语句。这个信息直接决定了你该用哪种方式导入也决定了目标库需不需要预先准备表结构。如果是完整备份你基本不需要做太多准备直接建好连接、新建一个空白库然后按下面第 3 节的方法执行即可。如果是纯数据导出你需要先手动执行建表语句或者让 Navicat 根据导入向导的结构映射来建表。2. 环境准备Navicat版本与目标数据库规划确认完文件没问题接下来把导入前的环境准备好。这里的准备不只是“打开 Navicat 就行”还包括连接对象选择、数据库创建和权限确认。2.1 确认 Navicat 版本与连接类型Navicat 有多个版本Navicat for MySQL、Navicat for PostgreSQL、Navicat for SQL Server、Navicat Premium 等。如果你用的是 Premium 版可以同时连接多种数据库但导入的时候也必须选对目标连接类型。举个例子你拿到一个 MySQL 的 dump 文件但 Navicat 里只建了 PostgreSQL 连接那是导不进去的。必须先在“连接”面板新建一个 MySQL 连接或者在 Premium 里选中已有的 MySQL 连接。还有一点容易被忽略Navicat 不同版本的菜单名称和位置略有差异。旧版本比如 11.x、12.x的“运行 SQL 文件”可能在“工具”菜单下新版本15、16、17通常在右键菜单或“文件”菜单下。不要死记位置按功能找就行。2.2 目标数据库的创建与规划如果 SQL 文件里没有CREATE DATABASE语句你需要先手动创建一个目标数据库。比如你准备把这个文件导入到一个名为mydb的库中右键连接 → “新建数据库” → 输入库名、选择字符集和排序规则。这里有个经验字符集的选择不要凭感觉要和 SQL 文件里的建表语句保持一致。怎么判断在 SQL 文件里搜一下CHARSETMySQL或DEFAULT CHARACTER SET其他数据库看它声明的是什么字符集就选什么字符集。比如文件里写的是CHARSETutf8mb4你在新建数据库时就选utf8mb4排序规则选utf8mb4_general_ci或utf8mb4_0900_ai_ci都行如果你用的是 MySQL 8.0。新建库的时候如果没把握宁可按文件里声明的字符集来也不要自己另选一套。宁多半步功不做无用功字符集不一致是乱码的头号来源。2.3 备份意识任何导入操作都是修改目标库的行为尤其当目标库里有现存数据时导入可能引发主键冲突、覆盖记录甚至删除表。导入前请先备份目标库——哪怕只是新建一个空库来导入也要确保不会误操作其他库。提示可以把这次导入看作一次“不可逆”操作。一旦导入完成想恢复原状几乎不可能。所以在导入前花一分钟右键目标库 → “转储 SQL 文件”备份一下不亏。3. 最稳妥方式使用Navicat的“运行SQL文件”功能接下来进入正题。我来分别讲三种导入方式从最稳妥的开始。3.1 为什么要优先用运行 SQL 文件Navicat 的“运行 SQL 文件”功能本质上是把 SQL 文件里的语句逐个取出来按顺序发送给目标数据库执行。它的优点在于不依赖额外向导所见即所得对完整备份类文件有建表语句、有 INSERT支持最好执行日志会逐步显示每一条语句的结果出错位置一目了然。而“导入向导”更适合处理 CSV、Excel、纯 INSERT 数据文件——它侧重“数据搬运”不擅长执行建表语句。所以如果你手里是一个标准 dump 文件优先用“运行 SQL 文件”。3.2 操作步骤从连接到执行以 Navicat Premium 16/17 为例完整流程如下第一步建立连接并选择目标库打开 Navicat在左侧连接树中找到你要导入的数据库连接比如localhost_3306展开它会显示该连接下的所有数据库列表。点击选中你要导入的目标数据库比如mydb右键单击它。第二步找到“运行 SQL 文件”在弹出的右键菜单中选择“运行 SQL 文件…”旧版本可能在“文件”下拉菜单中或者是“工具”→“命令行”。点击后会弹出文件选择框。第三步选择文件并设置编码选择你的.sql文件。这一步的关键是底部或右侧的“编码”下拉框——必须与文件实际编码一致。如果不确定先选 UTF-8 试试如果报错或中文乱码再回来换 GBK 重试。我建议在多选“遇到错误时继续”部分版本叫“继续执行”前先别勾选因为我倾向于第一次跑的时候让它停下来这样能第一时间看到问题在哪。第四步执行并观察日志点击“开始”Navicat 会在底部弹出“消息”日志面板字商会显示执行过程和结果。正常情况下每一条 SQL 语句后会显示Query OK或执行成功。如果有报错日志里会给出具体的错误行号和错误信息。第五步刷新查看结果执行完毕后按 F5 刷新左侧连接树。展开mydb下的“表”如果能看到新建的表说明导入成功。双击任意一张表点击“表数据”标签页查看数据行数。3.3 运行大文件时的注意事项如果一个 SQL 文件超过 100MB直接跑“运行 SQL 文件”可能很慢甚至让你怀疑是不是卡死了。这种情况有几个应对办法检查 max_allowed_packet仅 MySQLSQL 文件里如果有超大的单条 INSERT 语句且包含大量行会触发 MySQL 的max_allowed_packet限制。默认值通常是 16MB 或 64MB超出会报Packet too large错误。解决方法是临时调大SET GLOBAL max_allowed_packet 1073741824; -- 1GB这个设置重启 MySQL 后失效但临时导入足够用了。注意你的 MySQL 用户需要有 SUPER 或 SYSTEM_VARIABLES_ADMIN 权限。分批执行如果文件实在太大用文本工具按 5-10 万行一个片段拆分分多次运行。拆分工具可以用 VS Code 的大文件编辑插件也可以用命令行split -l 50000 xxx.sqlLinux/macOS 环境或 Notepad 的插件。关掉自动提交有些数据库的驱动在批量插入时默认每条语句自动提交非常耗时。你可以在执行前在 Navicat 查询窗口执行SET autocommit 0;然后在“运行 SQL 文件”中跑。不过我个人不推荐新手用这个方法容易忘记提交导致数据丢失或锁表。4. 快速方式拖拽导入与直接粘贴SQL脚本偶尔你会遇到一些不那么正规的 SQL 文件也可能只是几张表的 INSERT 语句这时候用“运行 SQL 文件”有点杀鸡用牛刀可以考虑下面两种轻量方式。4.1 把 SQL 文件直接拖入 Navicat 窗口Navicat 的图形界面非常友好甚至可以直接把.sql文件从系统文件管理器拖拽进入 Navicat 窗口。拖进去之后Navicat 会自动用内置编辑器打开这个文件相当于只读打开的 SQL 脚本你可以检查、搜索内容但不会自动执行。注意拖拽只是打开文件不是导入。很多人拖进去之后看到一堆语句以为已经导完了结果表一个都没建。打开后你还需要按 CtrlA 全选然后点击“运行”工具条上的三角形按钮或者右键选择“运行已选中的查询”。这个方式适合小文件几十行到几千行因为全选查询时执行日志会把每一条结果都刷出来文件太大容易卡界面。4.2 直接复制粘贴执行如果 SQL 文件内容很少比如只有十行、二十行 INSERT完全不需要用文件导入直接在 Navicat 中打开目标库的“查询”窗口把内容粘贴进去点击“运行”就可以了。但这里面有一个巨大的坑粘贴时编码可能出问题。尤其是你从 Windows 上的旧文档或网页里复制的 SQL如果源内容是 GBK 编码粘贴到 Navicat 查询窗口默认 UTF-8就会乱码。粘贴后先看一眼中文是否正常再执行。4.3 为什么说这两种方式只适合小文件执行两种方式本质上都是在 Navicat 的查询编辑器里跑 SQL而 Navicat 查询编辑器对超长文本的光标定位、语法高亮、撤销操作都不太友好。一个 50 万行的 INSERT 语句文件直接拖进来编辑器的渲染都比较吃力全选运行时“未响应”也不是没可能。所以我的经验判断是文件超过 1MB直接用“运行 SQL 文件”文件小于 500KB 或者只是一些零散的记录可以考虑拖拽或粘贴。5. 另一类导入场景使用“导入向导”处理纯数据脚本“运行 SQL 文件”虽然好用但有些场景它并不合适。最典型的情况是你手里这个.sql文件里全是INSERT INTO ... VALUES (...);一条条的 insert 语句没有建表语句。如果你对着一张空表执行结果肯定是“表不存在”。5.1 什么时候需要用导入向导当 SQL 文件满足以下条件时请改用“导入向导”文件里只有INSERT语句没有CREATE TABLE你已经手动或者通过其他方式在目标库建好了表结构SQL 文件里的 INSERT 语句字段顺序和目标表字段顺序不一致比如文件里是(id, name, age)目标表是(age, name, id)。5.2 导入向导实操步骤在 Navicat 里右键目标表注意是表不是数据库→ “导入向导” → 选择文件类型为 SQL 文件部分版本叫“SQL 脚本文件”。之后跟着向导走选择源文件指定 SQL 文件路径确认编码选择目标表如果预先建好了表选中它如果要新建点击“新建”并填写表名字段映射这是最关键的一步。向导左侧是源文件的字段右侧是目标表字段你需要在中间确认一一对应关系。如果源文件某列在目标表中不存在勾选“忽略”即可模式选择“插入”还是“更新/插入”推荐“更新/插入”能在主键重复时自动更新而不是报错中断执行点击“开始”等待进度条走完。5.3 导入向导的局限我要说清楚导入向导处理 INSERT 语句的健壮性不错但它不支持包含CREATE TABLE、USE、LOCK TABLES等 DDL 语句的文件。如果你的文件开头有这些语句一定要先用“运行 SQL 文件”的方式执行或者手动把文件里的 DDL 部分拆出去。还有一个反直觉的点导入向导处理超大文件反而比“运行 SQL 文件”稳定。因为它本质上是流式读取、逐批提交不会一次性把整个文件的内容砸给数据库。所以如果你要导入一个几百 MB、全部由 INSERT 组成的文件优先考虑导入向导。6. 导入完成后的3步校验真的导入成功了吗很多人导入完看见表有了数据行数也对就认为万事大吉。其实这时候恰恰不能放松因为有些数据错误是静默发生的你不会收到任何报错提示。6.1 检查行数与关键字段展开目标库的“表”列表鼠标悬停到某张表上Navicat 会自动显示总行数。这个行数要和源 SQL 文件里的行数做对比。怎么知道源文件的行数在文本编辑器里搜索INSERT INTO统计出现次数。如果一张表有 100 条 INSERT 语句每条一条记录但导入后 Navicat 显示 99 行说明有一条因为主键冲突或其他原因被跳过了。6.2 抽查数据内容除了行数更要抽查典型数据。找个包含中文的字段双击打开表看看中文是否正常、有没有变成“”。如果出现编码问题修复方法不是重新导入重复导入会导致主键冲突、重复数据而是先清空表TRUNCATE再修复编码重新导入。6.3 检查外键与自增值导入较大的系统时外键关系最容易出现问题。比如两个表之间的关联数据在源文件中顺序合理但导入后由于各种中断可能个别外键指到了不存在的记录上。常见的排查方法是右键表 → “设计表” → 看“外键”标签页确认外键字段和目标字段是否一一对应然后跑几条 JOIN 查询看看原来关联的记录是否都还在。另一个容易忽略的是 AUTO_INCREMENT 自增值。导入数据后新插入记录的主键可能撞到现有数据的主键。所以记得检查一下表的“自动递增”列的值必要时用ALTER TABLE 表名 AUTO_INCREMENT 最大ID 1;手动修正。7. 高频问题排查乱码、报错、导入缓慢最后这部分我把实际工作中遇到最多的问题按出现频率排个序整理成一个实用的排查清单。7.1 导入后中文乱码这是我在工作中接手最多的求助场景。乱码的根源无非就是“文件编码”和“连接/表字符集”不一致。排查步骤用 VS Code 或 Notepad 打开文件查看右下角编码确认文件本身是什么编码在“运行 SQL 文件”或“导入向导”的编码下拉框中选择与文件一致的编码如果导入前建表了检查建表语句里的DEFAULT CHARSET确保表字符集支持中文utf8mb4最稳不建议用latin1连数据库的编码也确认一下Navicat 连接属性里的“编码”选项一般在“高级”或“SSH”标签附近默认通常为“自动”如果不对改成 UTF-8 或 GBK 试试。经验之谈大多数乱码问题的根源其实不在 SQL 文件本身而是执行 SQL 的那一端Navicat 或数据库会话的字符集和应用端不一致。比如 MySQL 会话的character_set_client是latin1SQL 文件里是 UTF-8执行时就会乱。7.2 导入时报错表不存在如果在“导入向导”或“运行 SQL 文件”时出现了Table xxx doesnt exist先不要怀疑文件有问题。大概率是文件里的 INSERT 语句先于 CREATE TABLE 执行了或者这个文件本身就不包含建表语句。检查方式打开 SQL 文件搜索一下有没有CREATE TABLE。如果有看看它在 INSERT 语句之前还是之后。正常情况下先建表后插入。如果你用“运行 SQL 文件”它是一条条按顺序执行的因此顺序没问题。如果你用“导入向导”它可能直接把 INSERT 语句丢给数据库此时必须确保表已存在。7.3 外键顺序导致导入失败你拿到的 SQL 文件可能是从一个带外键约束的库导出文件里有类似CREATE TABLE child ... FOREIGN KEY ...的语句。导入时如果 parent 表还没建好child 表的外键就会报错。通用的做法是在导入前先临时禁用外键检查。MySQL 下执行SET FOREIGN_KEY_CHECKS 0;导入完成后再执行SET FOREIGN_KEY_CHECKS 1;注意这个操作需要你在“运行 SQL 文件”之前先在 Navicat 查询窗口里对目标连接执行一次。PostgreSQL 用户则需要先SET session_replication_role replica;再导入结束后设回origin但不太建议新手乱设除非你确实知道自己在做什么。7.4 导入过程非常慢前面提过两个方法加大max_allowed_packet、拆分文件。补充一个非常容易忽略的点如果你的 SQL 文件里有一堆INSERT INTO xxx VALUES (...),(...),(...);这种批量插入语句跑得慢很可能不是因为数据量大而是因为表上有大量索引或触发器。临时做法导入前先删掉非必要索引导入后再重建导入前禁用触发器如果有权限的话ALTER TABLE ... DISABLE TRIGGER在 MySQL 里并不直接支持需要 DROP TRIGGER 后重建这个操作要谨慎。7.5 导入到一半卡住不动如果 Navicat 的进度条长时间停在某个百分比不要急着杀进程。先等五分钟观察底部状态栏的日志是否还在滚动。如果确定卡死排查方向是是否有锁表在 MySQL 中执行SHOW PROCESSLIST;看是否有LOCK WAIT的会话是否有大事务如果执行了BEGIN后大量插入事务日志可能把控制文件撑大导致性能骤降是否网络慢如果你远程连接的数据库传输大量数据时网络带宽可能成为瓶颈优先考虑在服务器本机执行或者先用压缩包传文件再在服务器端导入。8. 给新手的建议大文件导入前的终极方案前面讲了各种操作方法和排查技巧最后我想夹带一点个人私货是这些年来处理大文件导入时总结出的一个通用心法不要把 .sql 文件当作唯一的交付介质。如果你的合作方经常给你发很大的 SQL 文件你完全可以用更优雅的方式处理用压缩包传输.sql文件本质是文本压缩率通常很高。一个 500MB 的 dump 文件gzip 压缩后大概率只有 50MB 以下。让对方发.sql.gz或.zip文件你本地解压后再导入网络传输时间能省一大截。在数据库服务器直接执行如果你是服务器管理员有 SSH 权限完全不需要经过 Navicat 中转。直接上传文件到服务器然后命令行执行MySQLmysql -u root -p 目标库名 file.sqlPostgreSQLpsql -U postgres -d 目标库名 -f file.sqlSQL Server用sqlcmd -S 服务器 -U 用户 -d 库名 -i file.sql这种方式比任何 GUI 工具都稳尤其适合超大文件。用更高阶的恢复工具比如 MySQL 的--compress选项可以在远程导入时压缩传输数据--single-transaction可以避免锁表--quick可以从服务器端快速读取。这些参数值得在导入前花十分钟查一查。我见过太多人卡在“用 Navicat 导入大文件”这一步其实换一条路走绕开图形界面直接用命令行几分钟就完事了。不是说 Navicat 不行而是图形界面有时反而把简单的事情复杂化了——它要逐条读取、渲染进度日志数据库本身执行这些语句可能非常快瓶颈全在 GUI 的日志输出上。根据我个人经验如果你是第一次往一个空库里导数据且文件不超过 200MB放心用 Navicat 的“运行 SQL 文件”如果你操作的是一个线上库、一个几 GB 的备份或者你已经受了半天“导入失败”的折磨果断切换到命令行模式你会回来感谢我的。最后再分享一个小技巧每次导入前把目标库名、源文件路径、编码、执行时间记录在案写成一个简单的导入记录文档。不需要多正式一行字都行。等你第三次遇到同样的问题时翻一下之前的记录就知道上次是怎么解决的了。这个习惯帮我绕开了无数重复踩坑的弯路。
返回列表