ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Navicat 导出 MySQL 表结构到 Excel:方法与避坑指南

Navicat 导出 MySQL 表结构到 Excel:方法与避坑指南 做开发这些年被问得最多的问题之一就是“能不能把数据库里那个表的结构整理成 Excel 发我一份”或者是“这批数据明细你导成表格给我我这边要做分析。”以前我都是吭哧吭哧截屏、复制粘贴到表格里稍微表多一点就手工整理半天遇到字段几十个的大表更是想摔键盘。后来用顺手了 Navicat 的导出功能才意识到这类需求根本不用手动折腾几步就能搞定而且能一次性把 MySQL 的表结构、索引、注释、以及表数据干干净净地落到 Excel 表格里。这篇文章就专门聊透这件事怎么用 Navicat 把 MySQL 数据库的表结构导出到 Excel怎么把表数据导出到 Excel以及在实操过程中那些必然会遇到的坑——比如中文乱码、大数字变科学计数法、数据量超过 Excel 行数上限怎么办等等。适合的人群很明确日常要跟 MySQL 打交道的开发、测试、运维以及需要经常给业务方提供数据表格或写数据库设计文档的同学。1. 这种需求通常来自哪里三类典型场景先说动机。很多人以为“导出表结构到 Excel”是闲着没事干实际上这活儿背后对应着非常具体的业务场景理解了这些场景你在操作时才知道该导出哪些列、需要带什么信息、数据量会有多大。1.1 交付数据库设计文档和评审材料最常见的场景是写数据库设计说明书。很多公司做项目立项、技术评审、等保测评、外包交付时都会要求提供一份“数据库设计文档”里面要列出每张表的字段名、字段类型、是否为空、默认值、注释说明甚至主键索引信息。这类文档的读者通常是架构师、项目经理、客户方的技术负责人他们未必会直接连上你的数据库更倾向于看一张能快速翻阅的 Excel 表格。字段一多、表一多手工整理就特别痛苦我见过有同事为了凑这份文档对着 Navicat 的设计表界面截了几十张图再一张张贴进 Word光整理就花了一天。其实用查询 information_schema 的方式一分钟就能把所有表的字段信息拉出来再导成 Excel清晰又完整。1.2 给业务方或数据分析团队提供数据明细开发过程中经常会有这样的需求运营同事说“把最近三个月的订单数据导给我”数据分析师说“我要跑一下用户标签需要用户表和订单表的全量字段”。这种时候直接给对方一个数据库账号显然不合适更稳妥的做法就是用 Navicat 把指定表的数据导出成 Excel 或 CSV 交付过去。这里的关键点在于管控数据量和字段范围。比如只导出某几个字段、只导出满足某些条件的数据或者只导出最近一周的数据这些都能在导出向导里通过自定义查询来完成而不是把整张表都倒给对方。1.3 数据归档与冷热分离时的元数据留存还有一个容易被忽略的场景数据归档。现在的业务系统越跑越大动辄上亿行通常会把历史数据归档到冷存储或者独立的历史库。在归档之前团队往往需要先梳理一遍当前线上库都有哪些表、数据量多大、保留策略是什么这个梳理结果一般就用 Excel 表格承载——既要列出表名、注释还要标出每张表的大致行数和归档状态。我之前参与过一个订单冷热分离的项目线上订单主表已经有两亿多行。第一步就是让 DBA 把所有业务表的表结构、索引、数据量拉出来形成一张《归档数据字典.xlsx》后面所有归档脚本的编写都以这份表格为依据。整个过程里Navicat 导出表结构到 Excel 就是最核心的一步。2. 表结构导出别傻乎乎找“导出表结构”按钮SQL直取系统库最靠谱很多人第一次接触这个需求时会习惯性地在 Navicat 的菜单栏里找“导出表结构”之类的按钮。我先说结论Navicat 自带的“导出”向导主要针对的是表数据并没有一个现成的“把表结构导成 Excel 表格”的按钮至少我在 15、16、17 这些常用版本里都没找到。所以表结构导出得换一条路通过 SQL 查系统库把表结构信息查成一张二维表再把查询结果导出为 Excel。2.1 为什么不推荐先导出 SQL 文件再转换有的教程会建议先用 Navicat 把表结构转存为 SQL 文件也就是我们常见的CREATE TABLE语句然后再借助 PowerDesigner 之类的工具反向生成 PDM再把 PDM 导出成 Excel。这条路子理论可行但实操起来非常折腾——你要额外装工具、学建模操作生成的字段顺序和注释格式也未必符合公司模板要求。对于“我只是想快速交一份表结构清单”这个需求来说直查information_schema明显更快、更可控。2.2 information_schema 核心查询一张 SQL 搞定表结构清单MySQL 里有一个默认的系统库叫information_schema其中COLUMNS表存放了所有表的字段级元数据。只需要对这张系统表做查询按表名和字段顺序排序就能拿到我们想要的表结构信息。以导出某个业务库假设库名叫mall的表结构清单为例最基础的 SQL 长这样SELECT TABLE_NAME AS 表名, COLUMN_NAME AS 字段名, COLUMN_TYPE AS 字段类型, IS_NULLABLE AS 是否为空, COLUMN_DEFAULT AS 默认值, EXTRA AS 自增/其他, COLUMN_COMMENT AS 字段说明 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA mall ORDER BY TABLE_NAME, ORDINAL_POSITION;执行之后查询结果就是一张标准的二维表每一行是一个字段每一列是字段属性。这时候右键点击结果集区域在菜单里选择“导出当前查询结果”或者使用结果集工具栏上的导出按钮格式选择 Excel就能把整个库所有表的字段结构一次性导出来。这里要特别说一下ORDINAL_POSITION这个字段它的作用是保证字段按照建表时的顺序排列。如果不用它排序系统表返回的行顺序在极端情况下可能跟真实表结构不一致导出的文档就会让人看得很困惑。2.3 进阶查询把主键、索引、字符集也带进来很多时候一份合格的表结构文档不只是字段列表还要把主键索引、字符集这些信息也体现出来。COLUMNS表虽然包含了COLUMN_KEY字段值为PRI表示主键MUL表示普通索引UNI表示唯一索引但它不会直接告诉你“这张表的字符集是什么”。如果需要更完整的元数据可以关联一下information_schema.TABLES表把表注释、表字符集一起查出来SELECT t.TABLE_NAME AS 表名, t.TABLE_COMMENT AS 表说明, t.TABLE_COLLATION AS 表字符集, c.COLUMN_NAME AS 字段名, c.COLUMN_TYPE AS 字段类型, c.IS_NULLABLE AS 是否为空, c.COLUMN_DEFAULT AS 默认值, c.COLUMN_KEY AS 键类型, c.EXTRA AS 自增/其他, c.COLUMN_COMMENT AS 字段说明 FROM information_schema.TABLES t LEFT JOIN information_schema.COLUMNS c ON t.TABLE_NAME c.TABLE_NAME AND t.TABLE_SCHEMA c.TABLE_SCHEMA WHERE t.TABLE_SCHEMA mall ORDER BY t.TABLE_NAME, c.ORDINAL_POSITION;这条 SQL 会返回包含表说明、表字符集在内的更完整结构信息。键类型那一列里PRI就是主键UNI是唯一索引MUL是普通索引拿到 Excel 里之后再用 Excel 的条件格式给PRI标个底色一份很专业的表结构文档就出来了。2.4 查询结果转 Excel 的两个操作路径查询结果拿到之后转成 Excel 有两种常见的操作方式方式一结果集右键导出。在 Navicat 查询窗口执行 SQL 后下方结果集的空白区域点右键选择“导出当前查询结果”然后跟着向导走格式选 Excel 文件xlsx或xls指定保存路径下一步下一步即可。这种方式导出的内容就是你当前查询窗口里的数据灵活度最高。方式二直接复制粘贴。如果只是临时要一份小范围的表结构直接在结果集里用鼠标选中所有行CtrlC然后到 Excel 里 CtrlV也能达到目的。这种方式不经过导出向导非常快但数据量特别大的时候比如整个库几百张表、上万个字段可能会出现复制不全或者 Excel 卡死的情况这时候还是走方式一更稳。3. 表数据导出Navicat 导出向导完整走查表结构怎么导出说清楚了接下来是更常被问到的怎么把表数据本身导出到 Excel。这一部分内容并不难但里面的细节选项实在太多了很多人就是栽在某个不起眼的勾选项上导出来的文件要么乱码、要么字段错位、要么数据量不全。3.1 导出入口右键菜单与工具栏按钮Navicat 导出表数据的入口很直白。最常用的方式是在左侧导航栏里找到你要导出的那张表直接右键菜单里会有一个“导出向导”Export Wizard的选项点进去就是导出流程。如果你用的是 Navicat 17 或者 16 以上的版本主工具栏上通常也会有一个明显的“导出”按钮效果是一样的。需要留意的是右键菜单里“导出向导”导出的是表数据这里的“导出”有两个分支一个是导出成 SQL 文件、CSV、Excel 等常见格式另一个是“导出为其他数据库”比如把 MySQL 表数据同步到另一个 MySQL 库里。我们要选的是前者。3.2 关键选项逐项说明进入导出向导后界面大致分为几个步骤。我以 Navicat 16/17 的英文习惯菜单为例中文版界面文字略有差异但逻辑一致。下面是每一步的关键选项第一步选择导出格式。在格式列表里选“Excel 文件xlsx”。如果你是给老旧的 Excel 2003 用户那可能需要选xls格式否则新版本 Excel 打开xls也没问题这一点看对方环境即可。第二步选择数据源。这一步会列出你当前连接下的所有表你可以勾选一张表也可以一次勾选多张表。如果只想导出满足某些条件的数据注意右侧还有一个“高级查询”或“自定义查询”的选项可以手动写WHERE条件。比如我只想导出最近 7 天的订单SELECT * FROM order_info WHERE create_time DATE_SUB(NOW(), INTERVAL 7 DAY);第三步设置导出选项。这里有几个非常关键的勾选项“包含列的标题”这个必须勾上导出的 Excel 第一行才会是字段名不勾的话整张表就是一堆裸数据别人根本看不懂。“遇到错误时继续”建议勾选万一中间某条数据有问题不至于整个导出中断。“以十六进制显示二进制值”如果你的表里有BLOB或BINARY类型的字段默认情况下导出的内容会是一堆无法阅读的二进制乱码勾选这个选项至少能让数据以十六进制字符串的形式保留下来后续可以再还原。第四步选择目标文件。这一步就是选保存路径和文件名。如果你选择了多张表导出这里还需要选择“导出到同一文件的不同工作表”还是“导出到多个文件”。我强烈建议多表导出时选择“导出到多个文件”也就是每张表一个独立 Excel 文件这样最不容易出问题。放在同一个工作簿的不同 sheet 里虽然可行但 Navicat 在某些版本下对多 sheet 的支持并不稳定容易导出失败。我后面还会再讲这个问题。第五步开始导出。点击开始之后会有一个进度条导出完成后会显示成功导出多少行、耗时多少。如果某一步报错下面的日志窗口会有具体原因。3.3 批量导出多张表的正确方式当你需要导出的表很多时比如要把一个库下所有以order_开头的表全部导出来一个一个右键导出会非常累。这时可以在导出向导的数据源步骤里用按住 Ctrl 或者 Shift 的方式多选表或者直接在过滤框里输入order_%来筛选出你想要的那批表。不过多表导出时要注意如果你选了导出到同一个文件的不同工作表很可能遇到某个版本 Bug 导致只生成了第一张表的内容。我自己在 Navicat 16 上就遇到过几次。最稳妥的做法是多表导出时选择“导出到多个文件”导完之后如果需要合并再用 Excel 的“合并工作簿”功能或 Python 脚本去处理。3.4 表数据导出的两种常见场景全表导出与按条件导出全表导出没什么好说的直接选中表、走向导就行了。但实际工作中按条件导出才是常态。你可以在“选择数据源”那一步通过勾选“允许自定义查询”或者“指定查询”来写 SQL把需要导出的行和列都限定好。比如导出一个用户表但只导出状态为 1 的活跃用户只要用户名、手机号、注册时间这三个字段SELECT user_name, mobile, register_time FROM user_info WHERE status 1;这种导出方式比全表导完再在 Excel 里筛选要高效得多也避免了给业务方传递过多敏感字段的风险。4. 当数据量超过 Excel 上限时三条可落地的对策我在做订单导出的项目里最头疼的不是导出的操作流程而是数据量本身。Excel 能装的行数是有限的一旦表数据超过 Excel 的承载上限导出向导要么直接报错要么导出的文件打开后只有一部分数据非常坑。先明确一下上限数字这张表建议你收藏后面用得上文件格式单表最大行数单列最大列数说明Excel 2003xls65536256老版本格式限制严苛Excel 2007xlsx104857616384现代 Excel 的极限CSV逗号分隔文本无严格上限无严格上限取决于文本编辑器的能力如果你的数据行数超过 104 万行直接导出xlsx是非常危险的。这里给你三条我实测过的应对方案。4.1 对策一导出为 CSV 而不是 Excel如果对方只要数据不强迫要求 Excel 格式最简单的方式就是导出成 CSV 文件。CSV 本质上是一个文本文件用记事本、Sublime、VS Code 都能打开Excel 也能直接打开。在 Navicat 导出向导的第一步格式选择“CSV”然后注意编码设置。我建议选择 UTF-8 编码但这里有个坑直接选择 UTF-8 导出的 CSV用 Excel 打开时中文很可能乱码。原因在于 Excel 默认用 ANSI 编码读取 CSV对 UTF-8 文件不太友好。解决办法是选择“UTF-8 带 BOM”的编码格式或者导出后在文本编辑器里通过“转换为 UTF-8 with BOM”再保存一次。4.2 对策二用 WHERE 条件分批切片导出如果对方坚持要 Excel 格式而数据量又超过 104 万行那就只能“分片导出”。原则是在导出向导的自定义查询里加上时间或 ID 范围条件把大表拆成多个片段每个片段控制在 50 万行以内导出成一个 Excel。比如某张订单表有 300 万行按日期拆成三段-- 第一批 SELECT * FROM order_info WHERE create_time 2024-01-01 AND create_time 2024-02-01; -- 第二批 SELECT * FROM order_info WHERE create_time 2024-02-01 AND create_time 2024-03-01; -- 第三批 SELECT * FROM order_info WHERE create_time 2024-03-01;这样导出的三个文件最后让业务方用 Excel 的 Power Query 或直接复制粘贴合并到一起即可。如果表没有明显的日期字段也可以按自增主键id分段比如id BETWEEN 1 AND 500000。分片导出虽然麻烦但胜在稳定不会因为数据量过大导致 Excel 崩溃。4.3 对策三放弃 Excel改用 Power Query 或数据采样视图有些场景下对方要的数据根本不需要全量。比如数据分析师想了解用户的字段分布、取值情况你完全没必要导出一亿行给他导出一份抽样数据就够了。可以在自定义查询里加上TABLESAMPLE或者ORDER BY RAND() LIMIT 100000这样导出的样本既保留了整体特征文件又小得离谱。如果对方坚持要全量数据做分析那我会建议他直接用 Power Query 或 Python 去读取 CSV而不是强行塞进 Excel。说实话几千万行的数据本身就不适合用 Excel 处理专业的数据分析工具或者直接连数据库跑 SQL 才是正途。这个时候作为导出方提供结构清晰的 CSV 就够了。5. 导出后必踩的五个坑及我的处理经验工具用久了坑也踩得差不多了。下面这五个问题是 Navicat 导出 Excel 时最容易遇到的我按照实际出现频率排了个序每个都给出了排查思路和解决办法。问题现象根本原因我的处理办法Excel 打开 CSV 中文乱码CSV 编码不是 UTF-8 with BOM导出时选 UTF-8 带 BOM 编码或用文本编辑器转码手机号/身份证变1.23E17Excel 把长数字自动转成科学计数法SQL 里用CONCAT把数字转成字符串或导入后设置文本格式日期时间变成一串数字或####Excel 不识别 Navicat 导出的日期格式导出后选中整列手动设置为日期格式或在 SQL 里格式化多表导出到同一 Excel 只有第一张表Navicat 多 sheet 导出偶发 Bug改成“每一张表导出为一个文件”导出过程中断报错信息不明确数据量过大或连接超时分批导出并适当调大 Navicat 的连接超时时间5.1 中文乱码一切乱码都是编码没对上乱码这个问题在导出 Excel 时不太常见因为xlsx本身就是按 UTF-8 封装的Navicat 处理得比较好。乱码高发区在 CSV——尤其是直接给业务方 CSV 文件时他们双击用 Excel 打开中文全变成“锟斤拷”。这里分享一个小技巧在 Navicat 导出 CSV 时有一个“高级”选项卡里面可以设置“文件编码”如果列表里看不到“带 BOM”的选项就先按普通 UTF-8 导出然后用 Sublime Text 或 VS Code 打开文件右下角编码位置点一下选择“Save with Encoding”中的“UTF-8 with BOM”保存后重新发给对方即可。5.2 长数字科学计数法移动手机号不可承受之痛这个坑我印象太深了。有一次导用户表给运营手机号在 Excel 里全变成了138****5678我还能忍但直接变成1.38E17可就完全没法用了。Excel 对超过 15 位的数字会自动转成科学计数法手机号虽然是 11 位不会触发但身份证号是 18 位还有bigint类型的雪花 ID、订单号等很容易中招。解决办法有两个。一个是 SQL 层面直接处理在自定义查询里不要直接 select 原始列而是用CONCAT(column_name, )把它显式转成字符串这样导出的 Excel 单元格里就是纯文本形式不会再变科学计数法。另一个是在 Excel 里处理选中整列右键设置单元格格式为“文本”再重新粘贴数据。但第一种方案显然更省事所以我现在的习惯是凡是遇到长度超过 15 位的数字字段查询时一律转字符串。SELECT CONCAT(user_id) AS 用户ID, user_name, CONCAT(id_card_no) AS 身份证号, register_time FROM user_info;5.3 日期时间导出后显示异常另一个高发问题是日期时间。Navicat 导出datetime字段到 Excel 时绝大多数情况下能正常显示为时间格式但如果你查询时手滑对这个字段做了某些函数处理比如DATE_FORMAT导出来的列可能变成了纯文本或者 Excel 直接显示为####。解决起来也不难如果导出后发现日期列全是####那通常是 Excel 列宽不够拉宽列就能正常显示如果显示为一串数字说明 Excel 没有把该列识别为日期你可以手动选中该列在“单元格格式”里改成对应的日期类型或者干脆回到 SQL 里用DATE_FORMAT(create_time, %Y-%m-%d %H:%i:%s)格式化好再导出。我个人比较推荐后者因为格式化之后的字符串不依赖 Excel 的本地语言设置别人打开什么样就是什么样。5.4 多表导出到同一个 Excel 文件Version 差异和坑前面提到过Navicat 导出向导支持多表导出但多表导出到一个工作簿里在不同版本上表现很不稳定。有的版本能正常生成多个 sheet有的版本只会导出第一张表。这种事靠运气是不可接受的。我的建议是除非你用的是确认过没问题的版本否则一律选择“导出到多个文件”。每张表一个xlsx文件名就用表名然后再用 Excel 的“数据 → 获取数据 → 来自文件 → 从工作簿”把多个文件合并到一张表里这属于 Excel 操作层面的活儿稳定可靠。5.5 导出中断大数据量下的隐性问题最后一个坑不那么常见但一旦遇到就很要命导出几百万行的表数据时向导跑到一半突然报错日志里只有一句简单的“Error”或“timeout”。这种情况通常与 Navicat 连接 MySQL 时的超时配置有关。解决办法有两个方向调整 Navicat 连接属性把“连接超时”“读取超时”适当调大。在连接编辑界面里通常能找到“高级”选项卡把socketTimeout、connectTimeout的值调高一些。如果不想动连接配置干脆就用分批导出的方式把大的查询拆成多个百行级的小查询。比如用LIMIT配合OFFSET分页导出这样每一次导出的压力都小不容易触发超时。6. 最后的实用经验让“表结构文档”这件事半自动化文章写到这里核心的操作步骤和避坑经验都讲完了。最后再分享一个我自己的小习惯表结构导出到 Excel 这件事做得多了之后我已经不满足于每次手动打开 SQL 查询窗口、复制粘贴 SQL、再走一遍导出向导了。我现在是这么干的把前面那条查information_schema的进阶 SQL 保存成一个文件放在电脑里每次需要生成表结构文档时只需要把数据库名替换一下执行、导出整个过程不超过一分钟。如果团队里不止一个人需要这种能力我会把 SQL 和文档模板一起放到团队的知识库或者代码仓库里谁需要谁自己取。另外用 Navicat 导出 Excel 时很多人容易忽略一个细节如果你是在查询窗口执行 SQL 后通过“导出当前查询结果”来导出那么查询结果的列名会直接成为 Excel 的表头。所以写 SQL 的时候AS别名千万别偷懒取什么名字Excel 表头就是什么名字。我见过有人导出之后表头全是英文字段名业务方看不懂又得返工。如果你经常要给业务方交付带格式的 Excel 表格比如带表头颜色、列宽、筛选按钮那么 Navicat 直接导出的“素版”表格可能不够看。我的做法是先用 Navicat 导出裸数据然后在 Excel 里套用一个做好的样式模板再另存为最终版本。过程并不复杂但交付观感会提升一个档次。数据库导数据这事儿看起来是个小功能用好了能省下大把的时间。希望这篇文章能让你少走点弯路该导出的数据稳稳当当落进 Excel该交的文档漂漂亮亮交出去。
返回列表