SQL 格式化
按子句换行、关键字大小写与缩进可调,附方言差异提示与错误定位。
这里做的是排版,不是解析。词法器先把输入切成 token:单引号字符串按两个连续单引号识别转义,注释、反引号与方括号标识符、数字各自成块。所以 where b='x;y;z' 里的分号不会被当成语句边界,-- 注释里那个孤零零的引号也不会开启字符串。排版的口径是「一个子句一行」,多条语句之间空一行,大小写只作用于关键字。
方言切换改变的是词法细节而不是语法判断:检查只到词法层面——字符串与注释是否收尾、括号是否配对,出错的行列会连着那一行原文一起给你。
SQL 格式化怎么用
- 美化:粘贴一条或几条语句(分号分隔),按子句换行输出,缩进宽度 1 到 8 可调;关键字大写、小写、保持原样三档只作用于关键字。
- 压成一页:选「压成一页」时所有换行消失、语句留在同一行,便于塞进代码里。此时 -- 与 # 行注释会被升级成 /* */ 块注释,否则同一行里它会把后面的语句全吃掉。
- 方言与提示:按实际数据库选方言,输出上方的提示条会写明该方言的真实差异(分页写法、拼接运算符、外连接写法等),只是提醒,不参与对错判定。方言改的是词法细节:MySQL 认反引号与 # 注释、双引号默认算字符串;PostgreSQL 认 "" 标识符与 $$tag$$ 美元引用;Oracle 认 q'[ ]' 替代引用;SQL Server 认 [ ] 标识符与 TOP。
常见问题
明明写错了语句,为什么没报错?
本工具不校验语法结构,也不检查表名列名是否存在——那需要真正的引擎解析器和数据字典。它只在词法层面报错:字符串没收尾、块注释少了 */、括号不配对,这几类会给出第几行第几列。
哪些关键字会另起一行?
select、from、where、group by、having、order by、limit、insert into、values、set、join 家族、union 家族等主关键字前换行;and、or、on、when、else 作为续行再缩进一级;括号里的子查询整体加一级缩进,收尾的右括号回到外层缩进。大小写只作用于关键字,函数名、表名、列名一律原样保留,count(o.ID) 不会被改成 COUNT。
压缩模式为什么把注释改成 /* */?
-- 和 # 的作用范围到行尾为止,把整条 SQL 压成一行后,行注释会把它之后的所有语句一起变成注释内容,执行时就少了一半逻辑。升级成块注释能保证内容仍然有效,代价是注释位置不再对应原来的行。
我的 group by 为什么占一行而不是两行?窗口函数、建表语句怎么排得怪?
OVER (PARTITION BY …) 里的 PARTITION BY、ORDER BY 只在括号内换行,不会当成顶层子句;CREATE TABLE 一类的 DDL 只按逗号与括号缩进,列定义不会自动对齐。这些是排版取舍,不影响语句含义。
对应功能编号 #98无需安装,手机端同样可用按 Ctrl + K 换工具