SQL 格式化完全指南:美化、方言与安全粘贴
从日志里抠出一行挤在一起的 SELECT、从 ORM 打出的超长查询,或同事丢来的「能跑但没法读」脚本时,第一步往往不是改业务条件,而是先把 SQL 排成可读结构,再核对 JOIN 与 WHERE。本指南说明美化与压缩、方言选项、操作步骤、失败对照与安全边界,并直接对接 WebUtils 本地 SQL 格式化工具。
核心一句话
格式化改的是空白与关键字大小写,不是执行计划;方言选错可能「美化失败」或风格跑偏,生产机密语句不要随手往公共环境粘。
下面按「美化边界 → 方言差异 → 操作 → 错误表 → 场景 → 安全」展开,可在 SQL 格式化 上对着练习。
1. 美化、压缩、校验各自解决什么
日常说的「整理 SQL」至少有三件事,工具可能都做,目标却不同。
| 动作 | 实际改动 | 适合做什么 | 不适合做什么 |
|---|---|---|---|
| 格式化(美化) | 换行、缩进、关键字大小写 | 读懂嵌套、Code Review、写文档 | 当作「语法修复器」自动改错语句 |
| 压缩 | 去掉多余空白,本工具还会去掉 -- / / / 注释 |
塞进日志字段、对比「结构是否同一句」 | 需要保留注释与排版的交付脚本 |
| 语法失败提示 | 库解析不过时抛错 | 尽早发现明显残缺 | 完整的静态分析 / 执行计划 |
关键边界: 正常格式化不应改写表名、列名、字面量与运算符语义;它服务的是人眼与 diff。若你依赖注释说明业务规则,压缩前先备份——本页「压缩」会剥注释再折叠空白。
前后对照(同一逻辑,仅空白与关键字风格不同):
-- 压缩前(故意挤在一行) select u.id,u.name from users u left join orders o on u.id=o.user_id where o.amount>100 order by o.created_at desc; -- 美化后(示意,缩进与换行依选项而定) SELECT u.id, u.name FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE o.amount > 100 ORDER BY o.created_at DESC;
2. 方言不是装饰:为何要先选对
SQL 有共同骨架,但标识符引用、函数名、分页、布尔与部分关键字因引擎而异。WebUtils 工具基于 sql-formatter,页面提供:
| 选项值 | 面向 | 典型差异(举例) |
|---|---|---|
| 标准 SQL | 通用 / 不确定时的起点 | 保守关键字集合 |
| MySQL | MySQL / 多数 MariaDB 习惯 | 反引号、LIMIT、部分函数 |
| PostgreSQL | Postgres | 双引号标识符、RETURNING、丰富函数 |
| SQLite | 嵌入式 / 本地库 | 方言子集,部分企业特性没有 |
| SQL Server (T-SQL) | SQL Server | TOP、方括号、部分过程语法 |
| Oracle (PL/SQL) | Oracle | ROWNUM、包过程风格片段 |
选错方言会发生什么?
- 格式化器对某段语法「不认识」→ 抛错,页面提示格式化失败。
- 仍能出结果,但换行位置怪异,或把方言特有关键字当普通标识符处理。
- 团队规范要求关键字大写、标识符小写时,要靠「关键字大小写」选项配合,而不是换方言硬凑。
建议:生产引擎是什么就选什么;跨库迁移脚本可先用「标准 SQL」看公共部分,再用目标方言各跑一遍,对比差异。
3. 工具上的参数分别管什么
打开 /tools/dev/sql-formatter,工具栏从左到右大致是:
- 方言下拉 — 见上表。
- 缩进 — 数字
0~8,默认2;控制空格缩进宽度(实现为tabWidth,不使用 Tab 字符)。 - 关键字大小写 — 保持原样 / 关键字大写 / 关键字小写。选「保持原样」时不强制改关键字大小写。
- 格式化 — 调用库美化当前编辑器全文。
- 压缩 — 去注释 + 空白折叠(见下文注意)。
- 复制 / 清空 — 剪贴板与重置。
处理在浏览器内完成;依赖 CDN 加载的 sql-formatter 库。离线或拦截 CDN 时格式化会不可用——这是环境问题,不是「SQL 写错了」。
4. 逐步操作
- 打开工具页。 进入 SQL 格式化,确认编辑区与工具栏可见。
- 选方言。 按真实数据库选择;不确定时用「标准 SQL」试跑,再切到具体方言。
- 设缩进与关键字风格。 与团队规范对齐(例如关键字大写、缩进 2)。
- 粘贴 SQL。 一次贴一条或一段;超大脚本可先截取出问题的子查询再美化。
- 点「格式化」。 成功时编辑区变为多行结构,并出现「格式化成功」提示;失败时弹窗带错误信息。
- 需要紧凑串时点「压缩」。 确认不再需要注释后再做;结果可复制进日志或单行配置。
- 复制带走。 用「复制」;若还要对照 JSON 配置或接口体,可另开 JSON 格式化。
能力边界(对照真实页面)
- 支持: 多方言美化、缩进宽度、关键字大小写、简易压缩、复制清空。
- 不宣称: 执行 SQL、连接数据库、解释执行计划、自动修复语义错误、完整存储过程 IDE。
- 压缩副作用: 会去掉
--行注释与/ /块注释;不要把「压缩」当成无损往返。
5. 常见失败与处理
| 现象 | 常见原因 | 怎么处理 |
|---|---|---|
| 弹窗「格式化失败」 | 语句残缺、引号未闭合、方言选错、夹杂非 SQL 文本 | 先剪到最小可复现片段;换方言再试;去掉日志前缀 |
| 美化后仍难读 | 深层嵌套子查询、过多内联 CASE | 手工拆 CTE / 临时视图后再格式化 |
| 压缩后逻辑「好像变了」 | 其实是注释被删,或你对比的是另一份粘贴 | 用未压缩备份 diff;勿在压缩稿上继续改业务 |
| 关键字大小写没变 | 选了「保持原样」 | 改为 uppercase / lowercase |
| 缩进看起来没生效 | 值为 0 或语句几乎无结构关键字 | 提高缩进;确认点了「格式化」而非只改了数字 |
| 点格式化无反应 | 编辑区为空或只有空白 | 先粘贴有效 SQL |
| 库加载失败 | CDN / 网络 / 脚本拦截 | 检查控制台;换网络或允许脚本 |
| MySQL 反引号 / PG 双引号怪异 | 方言与引用风格不匹配 | 切到对应方言;统一标识符引用规范 |
排错顺序
- 是否完整 SQL(有无日志时间戳、有无 ORM 前缀)。
- 引号与括号是否成对。
- 方言是否与目标引擎一致。
- 是否误点了压缩导致注释丢失。
- 再谈业务条件对不对——格式化只解决「看得见」。
6. 真实工作场景
场景 A:慢查询日志里的一行怪物
从 MySQL slow log 或 APM 复制出单行 SQL,贴进工具,方言选 MySQL,关键字大写。先看 JOIN 顺序与 WHERE 是否能下推索引条件,再决定是否加覆盖索引。把美化后的版本贴进工单,比截图糊成一团更利于复现。
场景 B:Code Review 风格不统一
有人关键字全小写、有人混用 Tab。约定「提交前用本工具:PostgreSQL + 缩进 2 + 关键字大写」,Review 只盯语义与索引,不再争论空格。注意:格式化不能替代 SQL Review 规范(禁止 SELECT *、必须有限流等)。
场景 C:迁移 MySQL → PostgreSQL
同一业务语句在两边各格式化一次,肉眼对比函数与分页写法。格式化器不会自动改写 LIMIT 为 FETCH,但能让差异段落对齐,方便写迁移清单。
场景 D:BI 同学导出的「能跑」脚本
报表工具导出常带多余别名与嵌套。先美化,标出可下推过滤的子查询,再交给数仓改写。压缩仅用于「确认去掉空白后是否同一句」,不要当交付格式。
场景 E:教学演示危险写法
用虚构表名与假数据演示笛卡尔积、漏连接条件。切勿把真实客户表结构、身份证号、手机号写进公开示例。
场景 F:和 JSON / 配置联调
接口用 JSON 传动态 SQL 片段(不推荐但现实存在)时:先把 JSON 在 JSON 格式化 里拆开,再把 SQL 字段值贴到本工具。两段工具分工,避免在一个框里混语法。
7. 安全与隐私:生产 SQL 不是普通文本
格式化工具让语句更易读,也让敏感信息更显眼。粘贴前默认假设:屏幕可能被录、历史可能被同步、公共电脑剪贴板不可信。
| 内容类型 | 风险 | 建议 |
|---|---|---|
| 真实用户 PII 字面量 | 泄露个人信息 | 换成 '[redacted]' 或哈希占位 |
| 生产连接串 / 密码出现在注释 | 凭证外泄 | 删除注释后再贴;压缩也会剥注释但不可当脱敏流程 |
| 权限相关的完整 schema | 攻击面暴露 | 只保留复现所需的最小表列 |
| 未公开的定价 / 库存逻辑 | 商业机密 | 用测试库等价语句 |
原则:
- 优先在测试库构造等价 SQL,再格式化分享。
- 必须用生产形态复现时,本地可信机器 + 用完清空编辑区与剪贴板。
- WebUtils 在浏览器处理,不因此等于「可以随便贴主库 dump」。
- 不要把格式化后的生产语句提交到公开 Issue 或群文件。
9. 团队落地建议
- 文档与 Wiki 中的示例 SQL 统一走同一套选项(方言 + 缩进 + 关键字)。
- PR 模板加一句:「新增/修改 SQL 请附格式化后版本」。
- 慢查询值班手册:粘贴前脱敏检查表(库名可留,字面量 PII 必换)。
- 区分「格式化风格」与「查询性能」:美化漂亮的全表扫描仍然是慢查询。
- 存储过程、动态 SQL 拼接若格式化失败,优先缩小到静态片段,再处理字符串拼接层。
把「先排版再争论」变成习惯后,SQL 协作从审美争论回到谓词、索引与数据量。
常见问题
格式化会改变查询结果吗?
在仅调整空白与关键字大小写、且语句本身合法的前提下,语义应保持不变。若结果变了,先怀疑贴错版本、连错库或压缩删掉了你依赖的注释旁信息,而不是「空格有魔法」。执行前仍以目标库解释器为准。
为什么选了 MySQL 仍失败,换标准 SQL 却能过?
可能片段更接近标准语法,或 MySQL 模式对某构造更严格/不同。以将要执行的引擎为准排查;「能格式化」不等于「能在生产跑」。对照报错信息缩小到出错子句。
压缩后能不能再美化回去?
可以再次格式化恢复缩进,但注释无法从压缩结果还原。需要注释时务必保留压缩前副本。
支持一次格式化整个迁移目录吗?
本页是浏览器单编辑区工具,面向片段与中等长度脚本。仓库级批量应用请用 CI 里的 sql-formatter CLI 或编辑器插件,并与本页选项对齐。
关键字必须全大写才专业吗?
不一定。一致性比「全大写教条」重要。工具提供三种策略,是为了适配既有代码库,不是宣布某一种才正确。
在线格式化安全吗?
WebUtils 在本地浏览器调用格式化库。仍请避免在不可信设备粘贴含密钥与 PII 的生产 SQL,用完清空。安全取决于你的操作环境与内容,而不仅是「有没有上传按钮」。
存储过程、触发器能完美美化吗?
复杂 BEGIN…END、厂商扩展在方言支持范围内通常可改善可读性;遇到失败就拆段。不要期望网页工具替代数据库厂商 IDE 的全过程校验。
和 ORM 生成的 SQL 怎么配合?
先开 SQL 日志拿到最终文本,再格式化。ORM 与手写 SQL 混用时,以数据库实际收到的语句为准做索引分析。
继续浏览
用一条无敏感数据的查询走通「选方言 → 格式化 → 复制」,再处理真实慢查询时先做脱敏。也可返回指南列表继续浏览。