SQL 格式化

子句换行、括号缩进的 SQL 美化器,关键字大小写可调,字符串内容绝不改动。

日志里抠出来的 SQL 是一整行,读它要先肉眼分词;代码评审里看到手排的 SQL,每人缩进风格还不一样。本工具按稳定的排版规则重排:SELECT/FROM/WHERE 等子句各占一行,列表项逗号换行,括号内整体缩进,AND/OR 单独成行,JOIN 家族与子查询都有合适的位置。

排版之前先做词法切分:字符串、注释、双引号与反引号标识符会被完整识别并原样保留——'a,b' 里的逗号不会被当成列表分隔符,-- 注释不会被打散。关键字大小写可选大写、小写或保持原样,压缩模式输出单行版本便于日志对比。

为什么不需要理解 SQL 才能排版

SQL 没有统一语法规范,方言差异(窗口函数、CTE、方言关键字)让完整解析器的实现成本极高。而「好读」的排版规则只依赖词法层:知道哪些词是子句关键字、引号在哪里闭合、括号怎么嵌套,就足以做出正确的换行与缩进。这套实现因此天然兼容各数据库方言——不认识的词按普通标识符处理。

字符串与注释是神圣不可侵犯的

WHERE city = 'New York' 里的空格与逗号是数据的一部分,格式化动了它们查询结果就变了。词法器把字符串作为不可分割的 token,内部原样保留(包括 '' 转义与反斜杠转义);-- 与 /* */ 注释同样整段保留,压缩模式才跳过注释。

常见问题

支持哪些 SQL 方言?
词法层的规则是方言无关的:MySQL、PostgreSQL、SQLite、SQL Server 的常规语句都能正确排版。反引号(MySQL)与双引号(标准)标识符都被识别。存储过程体内的复杂控制流可能排版不够理想,但不会改变语义。
格式化会改变 SQL 的执行结果吗?
不会。改变的只有空白与关键字大小写,两者在 SQL 里都无语义。字符串与注释内的内容原样保留。
压缩模式有什么用?
把多行 SQL 压成单行,便于塞进日志、Excel 单元格或对 diff。字符串内的空白不受影响。

相关工具