2026/10/11 14:04:48

Navicat导入Excel到MySQL:字段映射、参数设置与避坑指南

Navicat导入Excel到MySQL:字段映射、参数设置与避坑指南 简介这份PDF资源面向需要将Excel电子表格数据批量迁移到MySQL数据库的开发者与数据库管理员尤其适合刚接触Navicat导入功能、希望快速完成结构化数据入库的初中级用户。资源以单份PDF文档形式呈现压缩包约189KB内容围绕Navicat导入向导展开涵盖环境版本说明、Excel列名与表字段对应、自增主键处理、文件名英文规范、追加与覆盖模式选择以及导入失败时查看日志的排错思路帮助读者避开版本差异导致的常见坑点。目前已有6644人学习下载说明该操作场景在实际工作中需求广泛。读者可借助这份简明总结快速掌握从准备Excel到确认导入成功的完整流程减少手动录入的繁琐提升数据迁移效率。1. 从一份脏 Excel 到 MySQL 表Navicat 导入到底替你干了什么运营同事甩过来一个 12 万行的 Excel列名带空格、手机号被存成科学计数法、日期列里混着「2024/1/1」和「2024-01-01」两种写法要求下班前进 MySQL 供报表查询。这种场景下Navicat 的导入向导几乎是多数人第一个想到的工具——它把「读 Excel、猜字段类型、拼 INSERT、分批提交」这一整套动作包进了一个图形界面。但很多人点完「下一步」就翻车要么日期变成 0000-00-00要么长数字末尾几位被抹成 0要么导入到一半报主键冲突。这篇笔记就围绕「使用 Navicat 将 Excel 数据导入 MySQL」这件事把选型理由、字段映射、参数设置和血泪踩坑一次讲透适合手上有表要进库、又不想写一堆脚本的开发和数据同学。2. 导入前的三件准备版本、驱动与表结构2.1 Navicat 版本与 MySQL 驱动的匹配关系Navicat 导入 Excel 依赖两层东西一是它自带的 Excel 解析引擎二是连接 MySQL 的驱动。Navicat Premium 从 15 到 17 都支持 xlsx但 16 之前对 xls 的兼容更稳xlsx 里如果有合并单元格或数组公式老版本容易读成空值。MySQL 侧5.7 和 8.0 的驱动行为不同8.0 默认用 caching_sha2_password 认证Navicat 版本太老会连不上报「Authentication plugin cannot be loaded」。常见做法是确认 Navicat 至少 16MySQL 8.0 则在连接属性里把「使用高级连接」勾上或者干脆在 MySQL 里给这个账号改成 mysql_native_password。提示不要用破解版去连生产库。破解补丁常替换核心 dll导入大文件时崩溃概率明显升高而且出问题没有任何日志可查。2.2 先在 MySQL 里把目标表建好别让 Navicat 自动建Navicat 导入向导里有个「创建新表」选项很多人图省事直接勾。它按 Excel 前几行猜类型猜出来的 varchar 长度经常是 255遇到长文本就截断数字列可能被猜成 int结果小数位全丢。正确姿势是先自己写 DDL把字段类型、长度、字符集、主键、索引都定死导入时只做「追加」或「更新」。下面是一张典型的用户表CREATE TABLE user_import ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 自增主键, phone VARCHAR(20) NOT NULL COMMENT 手机号必须用字符串存, user_name VARCHAR(64) DEFAULT NULL COMMENT 姓名, amount DECIMAL(12,2) DEFAULT NULL COMMENT 金额两位小数, created_at DATETIME DEFAULT NULL COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_phone (phone) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci;逻辑说明phone 用 VARCHAR 而不是 BIGINT是因为手机号不参与运算且前导 0 和长度稳定性更重要amount 用 DECIMAL 避免浮点误差created_at 用 DATETIME 而不是 VARCHAR让后续按时间范围查询能走索引。参数上utf8mb4 是必须的Excel 里一个 emoji 就能让 utf8 三字节的列报「Incorrect string value」。2.3 Excel 侧的清洗把问题挡在导入之前导入失败十有八九是源文件的问题。动手前先做三件事第一删掉表头上方的标题行、说明行只留一行列名第二把日期列统一成「YYYY-MM-DD HH:mm:ss」文本格式别依赖 Excel 的显示格式因为 Navicat 读的是底层值第三长数字列订单号、身份证先设成文本再粘贴否则 Excel 已经把它变成科学计数法导进去就是错的。这一步用 Excel 的「分列」和 TEXT 函数就能搞定比导入后写 SQL 修数据省事得多。3. 用导入向导跑通第一次字段映射与四个必调参数3.1 从「导入向导」到字段映射的完整点击路径在 Navicat 里右键目标库或表选「导入向导」文件类型选 Excel。选中文件后向导会让你选 sheet 和起始行这里把「首行包含列标题」勾上。下一步是关键左侧是 Excel 列右侧是 MySQL 字段Navicat 会按列名自动匹配但列名有空格或大小写不一致时就会错位。手动把每个 Excel 列拖到对应字段不需要的列在右侧留空即可。再下一步是导入模式三个选项要分清模式行为适用场景追加直接 INSERT主键冲突就报错全新数据、表已清空更新按主键或唯一键 UPDATE 已有行补数据、改字段追加或更新存在则更新不存在则插入增量同步最常用3.2 日期、数字、编码三个参数怎么设向导的「选项」页里藏着几个决定成败的参数。日期格式要手动填成%Y-%m-%d %H:%M:%S如果 Excel 里是「2024/1/1」这种斜杠格式就填%Y/%m/%d填错会整列变 NULL。数字列如果 Excel 里带千分位逗号勾上「使用千位分隔符」否则 Navicat 会把它当字符串插进 DECIMAL 列直接报错。编码选 UTF-8别选「自动」自动识别在中文列名上经常翻车。还有一个「遇到错误继续」的勾调试阶段建议先不勾让它第一条错就停方便定位确认没问题后再勾上跑全量。-- 导入完成后先验证行数和关键字段别急着交付 SELECT COUNT(*) AS total, COUNT(DISTINCT phone) AS uniq_phone, SUM(amount) AS sum_amount, MIN(created_at) AS min_time, MAX(created_at) AS max_time FROM user_import;逻辑说明total 和 uniq_phone 对比能发现重复导入sum_amount 和 Excel 里的合计对一下能发现数字列被截断min/max_time 能发现日期解析错误导致的 1970 或 0000 值。参数上如果 uniq_phone 小于 total说明唯一键没生效或源数据本身有重复需要回 Excel 去重。3.3 大数据量下的分批与超时设置Excel 超过 5 万行时Navicat 默认一次性提交容易把连接撑爆报「MySQL server has gone away」。解决办法是在「高级」里把「每批记录数」调到 1000 到 5000 之间同时把连接属性里的max_allowed_packet在 MySQL 侧调大比如设成 64M。另外导入期间别去点 Navicat 的其他查询窗口图形界面卡住时它可能正在等服务器响应强行关掉会留下半截数据。稳妥做法是导入前先SET autocommit0导入完再COMMIT出问题直接ROLLBACK这是很多人不知道的后悔药。4. 导入翻车现场五类高频报错的现象、原因与解决4.1 日期列全变成 0000-00-00现象导入后 created_at 全是 0000-00-00 00:00:00。原因Excel 里日期是文本格式但格式串和 Navicat 设置不匹配或者 MySQL 的 sql_mode 含 NO_ZERO_DATE 导致插入被拒后写了零值。解决先在 Excel 里用TEXT(A2,yyyy-mm-dd hh:mm:ss)转成标准文本Navicat 日期格式填%Y-%m-%d %H:%M:%S并检查SELECT sql_mode必要时临时去掉 NO_ZERO_DATE。4.2 手机号或订单号末尾变 0现象18 位订单号导入后最后几位是 0。原因Excel 把它当数字存超过 15 位精度就丢了Navicat 读到的已经是错的。解决在 Excel 里先把该列设为文本格式再重新粘贴原始数据或者导入前用A2加前导单引号强制成文本导入后 MySQL 侧字段必须是 VARCHAR。4.3 中文乱码成问号现象姓名列显示 ???。原因Excel 文件本身是 GBK 编码Navicat 按 UTF-8 读。解决导入向导编码选 GBK 试一次或者用 Excel 另存为「CSV UTF-8」再导入。更彻底的办法是建表时字符集用 utf8mb4连接串也指定 utf8mb4两头对齐。4.4 主键冲突导致整批中断现象导入到第 3000 行报 Duplicate entry。原因源数据里有重复主键或之前已经导入过一部分。解决导入模式改成「追加或更新」让重复行走 UPDATE或者先在 Excel 里用条件格式标出重复值去重后再导。注意「追加或更新」依赖唯一键表上没建唯一索引的话它退化成纯追加。4.5 导入到一半连接断开现象进度条卡住最后报 Lost connection。原因单批数据太大、网络抖动或 MySQL 的 wait_timeout 到了。解决每批记录数降到 1000MySQL 侧把wait_timeout和interactive_timeout调大导入时别锁表。如果还是断改用 Navicat 的「数据传输」功能它比导入向导更耐大文件。5. 把导入做成可重复的流程定时任务与校验脚本5.1 用 Navicat 的「数据传输」替代手工导入导入向导适合一次性操作每周都要导的表就该用「数据传输」。它能把 Excel 或另一张表的数据按配置好的映射直接推到目标表支持保存为配置文件下次一键执行。配置里同样要设好每批记录数和错误处理策略区别是它可以被 Navicat 的「计划任务」调用配合 Windows 任务计划实现无人值守。注意计划任务跑的时候 Navicat 必须处于登录状态服务器上建议用常驻账号。5.2 导入后自动跑一遍校验 SQL不管手工还是自动导入完都该跑校验。下面这段 SQL 把行数、空值、异常值一次查出来SELECT (SELECT COUNT(*) FROM user_import) AS db_rows, (SELECT COUNT(*) FROM user_import WHERE phone IS NULL OR phone ) AS empty_phone, (SELECT COUNT(*) FROM user_import WHERE created_at 2000-01-01) AS bad_date, (SELECT COUNT(*) FROM user_import WHERE amount 0) AS neg_amount;逻辑说明db_rows 和 Excel 行数对不上说明有行被跳过empty_phone 大于 0 说明映射错位bad_date 能抓出日期解析失败neg_amount 抓出数字列被当字符串后转成 0 或负数的情况。参数上这些阈值按业务定比如金额允许为负就删掉最后一条。把这段 SQL 存成 Navicat 的查询每次导入后手动点一下比事后被业务追着问强。5.3 一个我踩过的坑别在导入时改表结构有次导入前顺手给表加了个索引结果导入速度从 3 分钟变成 20 分钟。原因是每插一行都要维护索引。血泪经验是大批量导入前先ALTER TABLE ... DISABLE KEYSMyISAM或直接删掉非唯一索引导完再重建。InnoDB 没有 DISABLE KEYS就先把二级索引 drop 掉导入后ALTER TABLE ... ADD INDEX重建速度差好几倍。这个习惯我保持了三年希望帮到你。本文还有配套的精品资源点击获取