Navicat需通过查询系统表导出带字段注释的数据字典:MySQL用information_schema.COLUMNS查COLUMN_COMMENT,PostgreSQL需关联pg_class、pg_attribute和pg_description;导出时须启用“包含列标题”并注意类型精度与文本限定符。
Navicat 怎么导出带字段注释的完整数据字典
navicat 本身没有“一键生成数据字典”的菜单项,所谓“完整数据字典”得靠组合操作拼出来——核心是用 select 查询系统表 + 导出为 excel/csv。直接点“导出”右键表名,只会导出表数据,不包含字段类型、长度、是否为空、注释这些元信息。
实操建议:
- 在 Navicat 中新建查询,执行针对当前数据库的元数据查询(不同数据库语法不同,MySQL 和 PostgreSQL 差异明显)
- 把结果集手动复制粘贴到 Excel,或用 Navicat 的「导出向导」选中查询结果 → 导出为 Excel/CSV
- 别指望“可视化设计”界面里能点出字典——表设计视图只显示单表结构,不聚合所有表的字段描述
MySQL 下查字段注释必须用 information_schema.COLUMNS
MySQL 的字段注释(COLUMN_COMMENT)只存在 information_schema.COLUMNS 表里,不是 SHOW CREATE TABLE 或 DESCRIBE 能直接导出的格式。漏掉这个表,导出来的字典就只剩字段名和类型,丢了业务含义。
常用查询示例(替换 your_database_name):
SELECT TABLE_NAME AS `表名`, COLUMN_NAME AS `字段名`, DATA_TYPE AS `类型`, IS_NULLABLE AS `是否为空`, COLUMN_DEFAULT AS `默认值`, COLUMN_COMMENT AS `注释` FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_database_name' ORDER BY TABLE_NAME, ORDINAL_POSITION;
注意点:
-
ORDINAL_POSITION是字段顺序,不用它排序,字段会乱序 -
COLUMN_COMMENT为空时,Excel 里显示NULL,不是空字符串,后续处理要留意 - 如果数据库名含下划线或特殊字符,要用反引号包裹,比如
`my_db-test`
PostgreSQL 用户别用 pg_tables 查字段注释
PostgreSQL 字段级注释存在 pg_description 表里,跟表结构分离。用 pg_tables 或 \d 元命令只能看到表级信息,查不到字段注释。
正确姿势是关联 pg_class、pg_attribute 和 pg_description:
SELECT t.relname AS "表名", a.attname AS "字段名", pg_catalog.format_type(a.atttypid, a.atttypmod) AS "类型", CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS "是否为空", d.description AS "注释" FROM pg_class t JOIN pg_attribute a ON a.attrelid = t.oid LEFT JOIN pg_description d ON d.objoid = t.oid AND d.objsubid = a.attnum WHERE t.relkind = 'r' AND a.attnum > 0 AND NOT a.attisdropped AND t.relname NOT LIKE 'pg_%' ORDER BY t.relname, a.attnum;
容易踩的坑:
-
pg_description.objsubid必须等于a.attnum才能对上字段注释,漏掉这条件,注释会错位 - PostgreSQL 默认不显示系统表,但
pg_class这些必须显式查,没替代视图 - 导出前先在 Navicat 设置「结果网格」→「导出时包含列标题」,否则 Excel 第一行没表头
导出后字段类型显示不全?检查 format_type() 或 DATA_TYPE 的精度截断
MySQL 的 DATA_TYPE 字段只返回基础类型名(如 varchar),不带长度;PostgreSQL 的 format_type() 默认也不显示 varchar(255) 这种完整定义,可能只写 character varying。
解决方法:
- MySQL:改用
COLUMN_TYPE替代DATA_TYPE,它返回完整定义,如varchar(100) - PostgreSQL:用
pg_catalog.format_type(a.atttypid, a.atttypmod)是对的,但确保a.atttypmod != -1(-1 表示无长度限制),否则会漏掉括号内容 - Navicat 导出 CSV 时,若字段含换行或逗号,务必勾选「使用文本限定符」,否则 Excel 打开会错列
最麻烦的其实是跨库一致性——同一个导出需求,MySQL 和 PostgreSQL 要写两套 SQL,且字段名、空值表示、注释存储位置全都不一样。没人替你自动适配,得自己留神。

















