Navicat 本身不支持直接导出 Markdown

navicat(含 v15/v16)没有原生的「导出为 markdown」选项。你看到的“复制为 markdown 表格”仅适用于查询结果集右键菜单,且要求手动执行 sql 查询后全选 → 右键 → 复制为 markdown 表格。它不适用于整库结构、表关系或数据字典的批量导出。

为什么先导出 HTML 再转 Markdown 是常见折中方案

Navicat 的「数据库快照」或「对象信息」功能可稳定导出为 HTML(文件 → 导出向导 → 格式选 HTML),生成的 HTML 包含表名、字段、类型、注释、主键/索引等结构信息,语义清晰、标签规整,比 CSV 或 SQL 更适合后续解析。但直接用浏览器另存为 Markdown 会失败——HTML 不是 Markdown,必须借助转换工具。

常见错误现象:markdown-it 或在线转换器把 <table> 渲染成乱码,或丢弃 title 属性里的真实字段类型(比如 datetime 显示为 varchar(255))真正可用的转换方式是:用 pandoc 命令行工具,配合自定义 CSS 选择器过滤冗余内容(如页眉、JS 脚本)关键参数不能少:pandoc -f html -t markdown –wrap=none –columns=200 input.html -o output.md,其中 –wrap=none 防止长注释被硬换行截断注意 Navicat 导出的 HTML 中中文注释可能含未转义的 &、,需先用 Python 脚本预处理:用 <code>html.unescape() 解码,否则 pandoc 会报错或漏内容

字段类型丢失问题必须手动修复

Navicat 导出的 HTML 表格中,“数据类型”列常显示为简化值(如全写成 VARCHAR),真实类型(如 TINYINT(1)、DATETIME)实际藏在对应 <td title="TINYINT(1)"> 的 title 属性里。pandoc 默认不提取 title,所以转换后类型信息就没了。

解决办法:改用 BeautifulSoup + lxml 写轻量脚本,遍历 <td>,优先取 td.get(‘title’),无则回落到文本内容示例逻辑片段:for td in soup.select(‘table tr td:nth-child(2)’): # 第二列是类型列 raw_type = td.get(‘title’) or td.get_text(strip=True) md_row.append(f’|{raw_type}|’)别依赖正则从 HTML 文本里硬匹配 title="…",因为部分版本 Navicat 会把双引号转成 ",导致正则失效

导出前必须检查连接字符集,否则注释全为空

即使数据库用的是 utf8mb4,Navicat 连接参数若没显式指定 characterSet=utf8mb4,MySQL 服务端会按 latin1 返回 column_comment,结果 HTML 里所有中文注释都变成空或乱码问号。

验证方法:在 Navicat 查询窗口执行 SHOW VARIABLES LIKE ‘character_set%’;,确认 character_set_client 和 character_set_connection 是 utf8mb4修复路径:右键连接 →「编辑连接」→「高级」选项卡 → 勾选「使用自定义字符集」→ 下拉选 utf8mb4这个设置必须在导出 HTML 前完成,导出后补救无效

导出为 HTML 再转 Markdown 听起来绕,但它能避开 Navicat 对视图、存储过程不导出的限制,也比手写 Python 全量查 information_schema 更省事;唯一绕不开的,是字段类型和中文注释这两处细节,必须在导出前设对连接参数、导出后用代码提 title 属性——漏掉任一环节,生成的文档就不可信。

立即学习“前端免费学习笔记(深入)”;

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。