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