piapia123
zh

SQL 标识符双引号处理

文本

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

两件事,各自对应一个真实场景。 加引号:把一段 MySQL 风格的 SQL 搬到 Postgres / Oracle 上。MySQL 的标识符默认大小写不敏感,而 Postgres 会把未加引号的标识符折叠成小写 —— 一个叫 `userID` 的字段搬过去就变成了 `userid`,语句报「列不存在」。加上双引号才能保住原来的大小写。 去引号:把 Postgres 导出的 `"users"`、`"userID"` 还原成裸标识符,好读,也好粘进那些不吃引号的老工具。 ⚠️ 最关键的一条:字符串字面量与注释里的内容一个字都不动。 一个「找到所有单词加引号」的天真实现在 `INSERT INTO t VALUES ('active')` 上会给出 `'"active"'` —— 数据里凭空多出两个引号,而且语句照样能执行,错误要到读数据时才发现。所以这里用一个小扫描器,字符串、注释、已有的引号标识符都整段跳过。 去引号时「去不掉就留着」:`"user id"`(含空格)、`"order"`(保留字)、`"2fa"`(数字开头)去掉引号之后都是非法标识符。这时保留引号并把数量报给你,而不是造出一段不能执行的 SQL。

功能

  • 给表名、字段名、别名等标识符批量加双引号
  • 或去掉已有的双引号与反引号(反引号会统一转成三家都认的双引号)
  • ⚠️ 字符串字面量里的内容一个字都不动(含 `''` 转义的字符串)
  • 行注释 `--` 与块注释 `/* */` 里的内容一个字都不动
  • SQL 关键字不加引号(给 `select` 加引号会让它变成一个列名)
  • 中文标识符也会加引号(`用户表` → `"用户表"`)
  • 去引号时遇到无法裸写的名字会保留引号,并如实报告有几个
  • 结果逐行可复制,说明文字不会混进复制内容

使用方法

  1. 粘贴一段 SQL
  2. 选「加双引号」或「去掉双引号」
  3. 结果实时更新,点复制取走

常见问题

字符串里的内容会被改吗?
不会,这是这个工具最要紧的一条。`INSERT INTO t VALUES ('active')` 里的 `active` 是数据不是标识符,加引号会把它变成 `'"active"'` —— 多出来的两个引号会真的存进数据库。而且语句照样能跑,错误要到读数据时才发现。同理,`-- 注释` 与 `/* 块注释 */` 里的内容也整段跳过。
关键字为什么不加引号?
因为给 `select` 加引号会让它从关键字变成一个叫 `select` 的列名 —— 语句的意思当场就变了。所以工具内置了一张 SQL 关键字表,命中的词原样保留。个别冷门关键字可能没在表里,那时顶多让语句报「列不存在」,一跑就发现,不会静默改语义。
去引号时为什么有些引号去不掉?
因为去掉之后那个名字不合法。三种情况:含空格或特殊字符(`"user id"` 去掉引号就断成两个词)、是保留字(`"order"` 去掉之后会与 `ORDER BY` 冲突)、数字开头(`"2fa"` 不是合法标识符)。这时工具保留引号,并在结果里告诉你一共有几个这样的名字 —— 造出一段不能执行的 SQL 比留着几个引号糟糕得多。

相关工具