首页/数据/SQL 速查/字符串转义与反斜杠差异

字符串转义与反斜杠差异

字符串里嵌引号、百分号的处理方式;MySQL 默认把反斜杠当转义符,PostgreSQL 标准字符串中反斜杠是普通字符,迁移前要核对。

SQL 速查数据更新于 2026-10-13

字符串转义规则

SQL 字符串字面量用单引号界定,字面量里再出现单引号就写两遍('It''s')。除此之外,反斜杠、百分号、换行在两库里的含义并不一致:MySQL 默认把反斜杠当转义符,PostgreSQL 在标准字符串里把它当普通字符,只有 E'...' 前缀才启用转义。跨库迁移、脚本生成、导入外部数据之前,先确认这两条规则。

基本信息

适用平台MySQL 8.0 / PostgreSQL 12+
单引号字面量内写两遍:'it''s'
MySQL 反斜杠默认是转义符;开启 NO_BACKSLASH_ESCAPES 后变回普通字符
PostgreSQL 反斜杠standard_conforming_strings=on(默认)时为普通字符,E'...' 才转义
跨行字符串两库都允许字面量跨行,换行符原样保留

典型使用场景

  • 导入含撇号的姓名、地址(O'Brien、D'Angelo),不加双写就会截断成语法错误
  • 把 Windows 路径写进配置表:MySQL 里反斜杠会被吃掉,需要双写或改用正斜杠
  • 生成 SQL 脚本时拼接动态值,必须先转义再入库,否则语句在特殊字符处崩掉
  • LIKE 模式里出现字面的百分号或下划线,要用 ESCAPE 指定转义符
  • 迁移前后抽样比对同一段文本,确认转义语义没有改变数据内容

转义写法对照

转义写法对照
-- 两库通用:单引号写两遍
SELECT 'It''s a test' AS s;

-- 仅 PostgreSQL:相邻字符串常量自动拼接
SELECT 'a' 'b' AS ab;

-- 通用做法:显式拼接
SELECT CONCAT('a', 'b') AS ab;          -- MySQL / PostgreSQL
SELECT 'a' || 'b' AS ab;                -- 仅 PostgreSQL

-- PostgreSQL 的 E'' 启用反斜杠转义
SELECT E'a\tb' AS with_tab;

同一写法两库对照

写法MySQLPostgreSQL
'a\b'反斜杠被转义处理标准字符串中原样保留两个字符
E'a\tb'不支持 E 前缀制表符,启用转义
'a' 'b'语法错误拼接为 ab
LIKE '%100%'百分号是通配符百分号是通配符
PostgreSQL 里拼接大段含引号的文本可以用美元引用($$...$$ 或 $tag$...$tag$),中间内容完全不做转义,写存储过程与函数体时最省事。
把值交给参数化查询(预处理语句)可以完全绕开手工转义:占位符由驱动处理,字符串内容不影响语句结构。

易错点

  • Windows 路径直接拼进 MySQL 字符串时反斜杠被转义吃掉,入库内容变形;应双写反斜杠或统一改成正斜杠
  • 把用户输入直接拼成 SQL 字符串是注入风险源头,参数化查询才是正确做法,转义只是补救
  • 迁移时只看语法能跑通不看数据:MySQL 与 PostgreSQL 对反斜杠的处理不同,同一段文本落库后内容不一致
  • 忘记 ESCAPE 时数据里的百分号与下划线被当成通配符,查询结果范围被意外放大

数据来源与参考

  • MySQL 8.0 Reference Manual · String Literals
  • PostgreSQL Documentation · String Constants
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌