# 22P06 — nonstandard_use_of_escape_character

> PostgreSQL SQLSTATE 22P06 的来源与诊断参考。
---

# 22P06

## 速览 {#at-a-glance}
SQL 扫描器发现反斜杠转义形式在当前字符串字面量规则下非标准或不安全。PostgreSQL 18.6 有一个不安全引号转义的 `ERROR` 分支，以及反斜杠-引号、反斜杠-反斜杠和其他转义用法的三个 `WARNING` 分支。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `22P06` |
| 条件名 | `nonstandard_use_of_escape_character` |
| 状态 | `有效` |
| 已知存在于 | `8.1.0` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER` |
| 别名 | `—` |

<!-- source facts: data/errcodes/22P06.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
扫描器把 `backslash_quote`、`escape_string_warning` 和 `standard_conforming_strings` 复制到自身状态。普通带引号字符串只有在 `standard_conforming_strings` 为 off 时才进入可处理转义的 `xe` 规则；显式 `E'...'` 直接进入该规则。显式 `E` 字符串在进入 `xe` 时把 `warn_on_first_escape` 初始化为 false，因此不会触发这组旧式的首次转义 `WARNING`；但它仍受 `backslash_quote` 的 `ERROR` 检查条件约束，`E` 前缀不是绕过该条件的通用办法。反斜杠后是单引号时，如果 `backslash_quote = off`，或安全编码模式遇到仅客户端支持的编码（client-only），就以 `ERROR` 发出主消息 `unsafe use of \' in a string literal`，并提示使用成对单引号。

当 `escape_string_warning` 和每个字符串只警告第一次转义的条件打开时，词法器会分别为 `\'`、`\\` 或其他转义每个字符串发出一次 `WARNING`。精确主消息是 `nonstandard use of \' in a string literal`、`nonstandard use of \\ in a string literal` 和 `nonstandard use of escape in a string literal`。这些是警告诊断，不是 `NOTICE`，本身不会中止语句。

## 报文 {#messages}
- `ERROR` 主消息：`unsafe use of \' in a string literal`；HINT：`Use '' to write quotes in strings. \' is insecure in client-only encodings.`
- `WARNING` 主消息：`nonstandard use of \' in a string literal`；HINT：`Use '' to write quotes in strings, or use the escape string syntax (E'...').`
- `WARNING` 主消息：`nonstandard use of \\ in a string literal`；HINT：`Use the escape string syntax for backslashes, e.g., E'\\'.`
- `WARNING` 主消息：`nonstandard use of escape in a string literal`；HINT：`Use the escape string syntax for escapes, e.g., E'\r\n'.`

## 诊断 {#diagnosis}
保留字面量写法和字符位置、是否有 `E` 前缀、`standard_conforming_strings`、`backslash_quote`、`escape_string_warning`、客户端编码及消息严重性。`ERROR` 分支会拒绝当前语句，警告分支可能允许语句继续，因此不能只根据“反斜杠”三个字判断结果。

## 处理 {#response}
嵌入单引号时写成连续两个单引号；确实需要反斜杠时使用明确的 `E'...'` 语法并固定预期转义语义。如果是 `ERROR`，显式事务已中止，重试前执行 `ROLLBACK` 或 `ROLLBACK TO SAVEPOINT`；自动提交模式下先修正字面量。`WARNING` 不需要事务恢复，但应优先修正字面量，不要靠隐藏警告或全局改策略来掩盖问题。引用路径不要求重置连接。

## 版本 {#versions}
锁定目录从 PostgreSQL `8.1.0` 记录此条件。引用的扫描器检查条件和精确消息来自 PostgreSQL 18.6 `REL_18_6`；本次没有运行区域设置或 GUC 案例。

## 相关 {#related}
[`22019`](../22019/)、[`42601`](../42601/)

## 来源 {#sources}
[`src/backend/parser/scan.l#L545-L560`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/scan.l#L545)

[`src/backend/parser/scan.l#L706-L720`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/scan.l#L706)

[`src/backend/parser/scan.l#L1423-L1459`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/scan.l#L1423)

结构化[证据记录](../../data/evidence/22p06.json)保存四个精确主消息、提示、检查条件、严重性和源码/运行边界。
