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