SQL:用反斜杠转义

SQL: escaping with backslash

我正在为 SQL 编写词法分析器以进行语法着色,但在解析代码时遇到了问题

SELECT * FROM table t WHERE t.name LIKE 'FOO\_%' ESCAPE '\';

我的理解是否正确,\ 会转义一些字符,例如下划线 (\_),但如果后面跟单引号 (\') 则不会转义?转义是否取决于 SQL 方言,或者所有(或许多)方言的行为是否相同?

'\' 通常表示不完整的字符串文字是否正确,因为反斜杠转义了单引号?

默认情况下,\ 在 SQL 中的 string/character 常量中没有任何特殊含义。单引号通过在 SQL 中加倍来“转义”,例如'Arthur''s house'

唯一具有特殊含义的情况是 ESCAPE 子句。为 SQL LIKE 转义通配符的默认转义字符是 \,但可以通过 ESCAPE 子句更改它。

所以下面的条件是相同的:

t.name LIKE 'FOO\_%'
t.name LIKE 'FOO\_%' ESCAPE '\'
t.name LIKE 'FOO#_%' ESCAPE '#'

但对于不用于 LIKE 条件的字符串,反斜杠在“SQL”中没有特殊含义,即在 ANSI 标准中 SQL.

然而,某些数据库产品 支持在常规字符串中使用 \ 对字符进行非标准转义。 Postgres 曾经这样做过,但是很长一段时间不赞成这样做,今天的默认行为是 \ 不会转义字符串常量中的任何内容,因此 '\t' 只是一个反斜杠字符,后跟一个反斜杠字符一个t。它可以配置为接受非标准字符串,这将导致“制表符”。

think MySQL 总是在字符串常量中使用反斜杠的这种非标准行为。