跳到主要内容

SQL 压缩怎么做:去注释、折叠空白、压成单行

讲清楚 SQL 压缩到底压掉了什么:去掉行注释和块注释、把多余空白折叠成单空格、可选压成单行,字符串字面量原样保留,全程浏览器本地处理。

发布于 作者 李雷
#sql #压缩 #开发工具 #数据库

SQL 压缩怎么做:去注释、折叠空白、压成单行

写完一条 SQL,你常常想把它塞进别的地方:代码里的字符串常量、一行日志、一个 webhook 负载。问题是,你手里那条查询为了给人看,带着缩进、换行和一堆 -- 这里是为什么 的注释。直接粘过去,缩进和代码本身的缩进打架,注释变成版本控制里的噪音。SQL 压缩做的就是把这些去掉:删注释、把多余空白折叠掉、可选地压成单行,而语义一点不变。

SQL 压缩到底压掉了什么

压缩只动三样东西,而且只动字面量之外的部分:

  • 去掉 -- 行注释和 /* … */ 块注释。
  • 把每一段连续的空格、制表符、换行折叠成一个空格。
  • 可选:把整段脚本压成一行,语句分隔符 ; 保留。

关键字、标识符、运算符、字符串内容全部逐字节原样输出。两个单词之间始终留一个空格,select id 绝不会被粘成 selectid。压缩前后,数据库把两种写法解析成完全相同的语句树,执行结果一致,变的只有字节数。

难点不是删空白,是知道哪里不能碰

真正麻烦的地方在于:有些 -- 和连续空格是数据,不是语法。单引号字符串、双引号或反引号标识符、T-SQL 的 [方括号] 名字、PostgreSQL 的 $tag$ … $tag$ 美元引用块,里面的内容都要原样保留,连成对的 '' 转义引号也照样不动。

举个例子:WHERE note = 'see -- this' 里的 -- 是字符串内容,不是注释起点。一个靠正则瞎删 -- 之后内容的脚本会把半个查询吃掉,而正经的压缩器会追踪引号状态,认出这是数据,留着不碰。

一个真实的压缩例子

输入(为了给人读而格式化过的查询):

-- 取最近 7 天的活跃订单
SELECT
    o.id,
    o.amount,        /* 单位:分 */
    u.name AS buyer
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE o.status = 'paid'
  AND o.note   = 'a -- b'   -- 注意这里的 -- 是数据
  AND o.created_at >= NOW() - INTERVAL '7 day'
ORDER BY o.created_at DESC;

开启「压成单行」压缩后:

SELECT o.id, o.amount, u.name AS buyer FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 'paid' AND o.note = 'a -- b' AND o.created_at >= NOW() - INTERVAL '7 day' ORDER BY o.created_at DESC;

两条注释没了,缩进和换行折叠成单空格,可 'a -- b' 里那个 -- 原封不动地留着,'paid''7 day' 这些字符串一字未改。这一段从 9 行降到 1 行,字节数掉了三成上下。

嵌进代码、日志、单行执行的场景

压缩后的单行最适合三类去处:

  • 嵌进代码:const QUERY = "…" 这种字符串常量,单行不用写别扭的续行符,diff 也干净。
  • 写进日志或链路追踪:可观测性工具按摄入字节计费,还会截断超长行。压成单行后,日志查看器能完整显示这条语句,而不是从中间被切断。
  • 走有大小限制的通道:URL 查询参数、消息队列消息体,每个字节都重要,压缩能把注释和缩进通常多占的 20%–40% 拿回来。

如果只想去注释和缩进、但保留每条语句一行,关掉「压成单行」即可,这是个折中:注释和缩进没了,但每个 ; 仍然另起一行。

和美化是一对逆操作

压缩是美化的反面。SQL 格式化器把查询展开成带缩进和换行的样子,方便人读;SQL 压缩器把这些全部去掉,方便机器低成本地存储和传输。编辑时格式化,要把查询嵌进代码或日志之前再压缩。格式化 → 压缩 → 格式化 来回走一遍,能拿回一条干净可读的查询。

实践上,我会把可读的格式化版本留在仓库里,只压缩要嵌入或传输的那份拷贝。一旦把版本控制里的查询也压成无注释单行,下一个人改它就得手工重排,还丢了 -- 为什么 注释,得不偿失。

本地处理,查询不出页面

我自己最看重的是这一条:整段压缩是浏览器标签页里运行的纯 JavaScript,对 SQL 做分词和重写。含表名或个人信息的查询不会发到任何服务器,也不会被记录。唯一要留心的是分享链接会把输入编码进 ?sql=…,所以含生产查询或密钥的 SQL,手动复制压缩结果就好,别去分享 URL。压缩这件事看着小,但放在数据库这种碰得到敏感数据的环节,本地处理才让人放心。


Made by Toolora · Updated 2026-06-13