编码解码哈希加密格式化时间转换开发生成文本处理网络工具其他工具
首页 / 格式化 / SQL压缩

SQL压缩

去注释去空白,SQL压成一行

输入
结果

这个工具能做什么

这个工具把书写时为了可读性而换行、缩进、加注释的 SQL 语句,压缩成没有多余空白的紧凑一行。开发中经常需要把一段 SQL 放进 JSON 配置、YAML、环境变量或某段代码的字符串常量里,原始的多行格式带着缩进和 -- 注释直接粘过去既占地方、又容易在转义时出错。SQL 压缩会一次性完成 sql 去注释和 sql 去空格两件事:删掉 -- 行注释与 /* */ 块注释,再把连续的空格、制表符和换行折叠成单个空格。压缩后的语句语义完全不变,仍可直接交给数据库执行。整个 sql minify 过程在浏览器本地完成,不会把语句上传到服务器。

压缩 SQL 看似只要几个正则替换就能搞定,但直接用正则很容易把字符串里的内容也一起破坏。工具实际是按字符扫描整段文本、维护一个状态机来判断当前位置处在普通代码、字符串还是注释之中。遇到单引号、双引号或反引号就进入字符串状态,此时任何空格、换行乃至 -- 和 /* 都被当作普通字符原样保留,直到匹配到对应的收尾引号才退出;SQL 里用两个连续引号表示的转义引号也会被正确跨过,不会被误判为字符串结束。只有在代码状态下遇到 -- 才吃掉到行尾、遇到 /* 才吃掉到 */,其余的空白才参与折叠。正因为区分了这几种状态,注释符号出现在字符串字面量里时才不会被误删。

最常见的用法是把开发时写得很舒展的查询压进配置或代码。比如一段带缩进和注释的多表 JOIN 查询,要塞进 Java、Go 的字符串常量或者 Nacos、Apollo 的配置项,先压成一行就省去手工删注释、拼接换行的麻烦,也避免换行导致的字符串拼接错误。又比如排查线上问题时,从慢查询日志或 ORM 打印出来的 SQL 往往夹杂大量缩进和框架生成的注释,压缩成一行后更方便贴进工单、聊天窗口,或用 diff 工具逐条比对两次执行的语句差异。对于要通过 mysql -e、psql -c 这类命令行参数直接执行的场景,压成一行也能省掉引号和换行的转义烦恼。

使用时有几个边界要留意。折叠空白时工具是把连续空白换成一个空格,而不是删到零个,因为 SELECT a FROM t 这样的关键字之间必须留有分隔,压成 SELECTaFROMt 会直接语法出错,所以结果是「一行但仍保留必要空格」而非字面上毫无空白。它按文本处理、并不解析具体 SQL 方言,因此 MySQL 里 /*! ... */、/*+ ... */ 这类本身携带可执行语义或优化器提示的「特殊注释」,会和普通块注释一样被当成注释删掉,语句若依赖这些提示请压缩后确认。另外它识别的是 -- 行注释和 /* */ 块注释,MySQL 特有的 # 行注释是否处理取决于实现,含 # 注释时最好先自行核对。它做的是压缩(minify)而非格式化,和 SQL 美化是相反方向的操作,需要重新展开阅读时应改用格式化工具。

SQL压缩是一个免费的在线工具,打开网页就能用,不用下载也不用注册。平时大家搜的“sql压缩”、“sql去注释”、“sql minify”,说的都是这个。

常见使用场景

使用方法

  1. 把内容粘贴到输入框(生成类工具直接设置选项)。
  2. 按需要选择选项,点操作按钮。
  3. 结果出现在下方,点「复制结果」即可带走。

常见问题

压缩后的 SQL 还能正常执行吗?
能。工具只删除注释、把多余空白折叠成一个空格,不改动任何关键字、表名和字面量,token 之间的必要分隔也会保留,因此压缩前后语义完全一致,可以直接交给数据库执行。
为什么字符串里的空格、换行和 -- 都原样留着?
因为引号包裹的是数据而不是代码,改动它会改变查询结果。工具靠状态机识别字符串边界,进入字符串后一切字符照搬,所以 '2024-01-01 00:00' 里的空格、或字符串中恰好出现的 -- 都不会被动。
这个工具支持哪些注释语法?
支持 SQL 通用的 -- 行注释(删到行尾)和 /* */ 块注释(可跨多行)。MySQL 的 # 行注释是否识别取决于具体实现,含 # 注释的语句建议压缩后再核对一遍。
SQL 压缩和格式化(美化)是一回事吗?
是方向相反的两件事。格式化是加换行和缩进让 SQL 更好读,压缩(minify)是去掉这些空白和注释让它更紧凑;想重新阅读被压成一行的 SQL,应该用格式化工具展开,而不是这个压缩工具。
贴进来的 SQL 会被上传或保存吗?
不会。压缩逻辑全部在你浏览器里用 JavaScript 运行,SQL 文本不经过任何服务器,也不会被记录,可以放心处理含表结构或线上数据的语句。

相关工具

查看全部「格式化」工具 →