必须先开启“启用SQL格式化”开关,否则所有格式化功能(快捷键、右键菜单、工具栏按钮)均无效;该开关默认关闭,需手动在“工具→选项→编辑器→SQL格式化”(Windows)或“Preferences→Editor→SQL Formatting”(macOS)中勾选Enable SQL formatting,且设置全局生效。
必须先打开“启用SQL格式化”开关
navicat 的 sql 格式化规则再细也没用,前提是功能本身开着。默认安装后这个开关是关闭的,ctrl+shift+f、右键菜单里的「format sql」、工具栏上的「美化 sql」按钮全都不起作用——不是快捷键冲突,也不是软件卡顿,就是根本没启用。
路径很固定:工具 → 选项 → 编辑器 → SQL 格式化(Windows)或 Preferences → Editor → SQL Formatting(macOS),找到 Enable SQL formatting 并勾选。这个设置是全局生效的,换连接、切数据库都不会重置。
- 别误以为「自动格式化」=「已启用」:自动格式化只是触发时机不同,开关不打开,它连自动的机会都没有
- 如果右键菜单里「Format SQL」是灰色的,90% 是这个勾没打上
- macOS 用户注意:
Ctrl+Shift+F常被系统 Spotlight 占用,建议改用右键菜单,或进系统设置关掉 Spotlight 快捷键
关键字大小写要手动锁定,别信“按数据库类型”
Navicat 默认会根据当前连接图标(比如右上角显示的 MySQL 或 PostgreSQL)动态调整关键字大小写,但实际协作中这反而制造 Git diff 噪音,甚至引发执行错误。
比如你连的是 MySQL,但写了 PostgreSQL 风格的双引号字段名("id"),Navicat 可能误判 SELECT 是普通标识符,格式化后变成小写;更麻烦的是,PostgreSQL 自定义函数名大小写敏感,my_func() 被强行改成 MY_FUNC() 就直接报错。
- 推荐统一设为
Uppercase keywords(全部大写)或Lowercase keywords(全部小写),别选Preserve original case或By database type - 函数名如
COUNT()、TO_CHAR()也会被一并修改,若团队约定函数小写,就选 lowercase;若依赖 PG 大小写区分,就关掉关键字大小写转换,靠人工控制 - 临时救急:右键连接 →「编辑连接」→ 把数据库类型改成目标类型(如从 MySQL 改成 PostgreSQL),再格式化
缩进和换行策略决定可读性,不是纯审美问题
很多人抱怨“格式化后全挤在一行”,其实是默认规则把 SELECT a, b, c FROM t WHERE x = 1 当作“简单语句”直接压平了。这不是 bug,是 Merge simple statements 和 Wrap after N characters 共同作用的结果。
-
Indent width设为4:2 太浅看不出嵌套,8 容易滑出屏幕,JOIN 多层时尤其明显 -
Wrap after N characters设为80~100:避免长 WHERE 条件拖成超长行,也方便 Code Review 时横向对比 - 务必取消勾选
Merge simple statements:否则INSERT INTO t VALUES (1); SELECT * FROM t;会被合成一行,破坏语义分隔 - 打开
Comma after line break和Break before WHERE这类细粒度开关,字段列表、WHERE 条件、JOIN 条件才能真正分行
中文注释错位或乱码?根源不在格式化逻辑
格式化后注释跑到行尾、缩进偏移、显示方块字,通常不是规则配错了,而是编辑器底层渲染出了问题。
- 检查右下角状态栏的编码,强制设为
UTF-8:GBK 打开 UTF-8 文件会导致中文解析失败 - 字体必须支持中文且为等宽:Windows 推荐
Consolas,macOS 用Monaco或Fira Code,别用系统默认非等宽字体 - 注释位置很关键:
name VARCHAR(32)--用户名容易被格式化引擎误当作语法一部分顶到行尾;改成name VARCHAR(32) -- 用户名(前面加空格)或用/* 用户名 */块注释更稳妥 - 如果重置配置后中文又乱了,大概率是
sql_format.xml被缓存污染,删掉它再重启 Navicat(路径见知识库)
最常被忽略的点是:改完设置后必须点「确定」,且不能勾选「仅对当前连接生效」——这个选项会让规则只在当前标签页起作用,切到新查询窗口就回退到默认。格式化规则本质是 XML 配置文件驱动的,GUI 界面只是它的外壳,点保存前多看一眼路径和作用域。


















