1.3.7. 转义字符处理

统一SQL支持对Oracle、MySQL源库的字符串转义字符进行规范化转换处理。根据源库类型、目标库类型以及sql_mode配置(是否包含NO_BACKSLASH_ESCAPES),统一SQL会自动处理反斜杠等转义字符的转换。

1.3.7.1. 概述

MySQL数据库支持使用反斜杠()作为转义字符,而Oracle数据库中反斜杠被视为普通字符。当进行跨库转换时,需要正确处理这些转义字符,以确保SQL语句在目标库中能够正确执行。

统一SQL通过以下配置项控制转义字符的转换行为:

  • unisql.conf.version:控制转义逻辑版本(0=旧版本,1=新版本)

  • unisql.mysql.sqlmode:源MySQL库的sql_mode配置

  • unisql.target.mysql.sqlmode:目标MySQL库的sql_mode配置

1.3.7.2. 转换规则

1.3.7.2.1. MySQL源库转义规则

当源库为MySQL时,根据源库和目标库的sql_mode配置(是否包含NO_BACKSLASH_ESCAPES),转换规则如下:

MySQL源库转义转换规则

源库NBES

目标库类型

目标库NBES

处理方式

说明

MySQL系

反斜杠double处理

\ 转为 \\

MySQL系

透传

直接透传,不做处理

Oracle系/PG系

透传

直接透传,不做处理

MySQL系

透传

直接透传,不做处理

MySQL系

转义序列消费

\t 等转义序列解析为实际字符

Oracle系/PG系

转义序列消费

\t 等转义序列解析为实际字符

1.3.7.2.2. Oracle源库转义规则

当源库为Oracle时,Oracle中反斜杠始终为普通字符,转换规则如下:

Oracle源库转义转换规则

目标库类型

目标库NBES

处理方式

说明

MySQL系

反斜杠double处理

\ 转为 \\

MySQL系

透传

直接透传,不做处理

Oracle系/PG系

透传

直接透传,不做处理

1.3.7.2.3. 支持的转义序列

当需要进行转义序列消费处理时,统一SQL支持以下MySQL标准转义序列:

MySQL标准转义序列

转义序列

含义

ASCII值

\0

NUL 空字符

0x00

\b

退格

0x08

\t

水平制表符(TAB)

0x09

\n

换行(LF)

0x0A

\r

回车(CR)

0x0D

\Z

Ctrl+Z(Windows EOF)

0x1A

\\

反斜杠

0x5C

\'

单引号

0x27

\"

双引号

0x22

1.3.7.3. 数据库分类

1.3.7.3.1. MySQL系数据库

以下数据库属于MySQL系,支持反斜杠转义:

  • MySQL

  • OceanBase-MySQL

  • TDSQL-MySQL

  • GoldenDB-MySQL

1.3.7.3.2. Oracle系/PG系数据库

以下数据库属于Oracle系或PG系,反斜杠为普通字符:

  • Oracle 19c

  • OceanBase-Oracle

  • DM(达梦)

  • GaussDB500-Oracle

  • GaussDB-Oracle

  • GaussDB-MySQL

  • GaussDB-MySQL-B

  • OpenGauss-MySQL

  • TDSQL-PG Oracle模式

  • TDSQL-PG

  • PostgreSQL

1.3.7.4. 影响的配置说明(具体参数说明请查看)

1.3.7.4.1. unisql.conf.version

控制配置文件版本:

  • 0 (默认值):旧版本行为,使用 unisql.mysql.backslash.escapes 作为源端的反斜杠转义控制, unisql.target.mysql.sqlmode 控制目标端的转义

  • 20250400007 :20250400007版本开始行为,使用 unisql.mysql.sqlmode 作为源端的反斜杠转义控制, unisql.target.mysql.sqlmode 控制目标端的转义

1.3.7.4.2. unisql.mysql.sqlmode

源MySQL库的sql_mode配置字符串。当包含 NO_BACKSLASH_ESCAPES 时,表示源库反斜杠为普通字符。

示例:

unisql.mysql.sqlmode=PIPES_AS_CONCAT,IGNORE_SPACE,BACK_QUOTES,ANSI_QUOTES,NO_BACKSLASH_ESCAPES

1.3.7.4.3. unisql.target.mysql.sqlmode

目标MySQL库的sql_mode配置字符串。当包含 NO_BACKSLASH_ESCAPES 时,表示目标库反斜杠为普通字符。

1.3.7.4.4. unisql.mysql.backslash.escapes(已废弃)

注意:该参数已废弃,仅在 unisql.conf.version=0 时生效。

1.3.7.5. 示例

1.3.7.5.1. 示例1:MySQL不含NBES转MySQL不含NBES(默认行为)

源SQL:

INSERT INTO t1 VALUES (1, 'C:\\Users\\test')

转换后(反斜杠double处理):

INSERT INTO t1 VALUES (1, 'C:\\Users\\test')

1.3.7.5.2. 示例2:MySQL含NBES转MySQL不含NBES

源SQL:

INSERT INTO t1 VALUES (1, 'C:\\Users\\test')

转换后(反斜杠double处理):

INSERT INTO t1 VALUES (1, 'C:\\\\Users\\\\test')

1.3.7.5.3. 示例3:MySQL不含NBES转Oracle

源SQL:

INSERT INTO t1 VALUES (1, 'Line1\\nLine2')

转换后(转义序列消费):

INSERT INTO t1 VALUES (1, 'Line1
Line2')

1.3.7.5.4. 示例4:Oracle转MySQL不含NBES(oracle 为源默认行为)

源SQL:

INSERT INTO t1 VALUES (1, 'C:\\Users\\test')

转换后(反斜杠double处理):

INSERT INTO t1 VALUES (1, 'C:\\\\Users\\\\test')

1.3.7.6. 注意事项

  1. LIKE正则匹配:对于MySQL中LIKE正则对于字符串的两层解析特殊情况,统一SQL不统一处理, 每个库自行特殊处理。

  2. LIKE正则匹配:对于MySQL中LIKE正则对于字符串中反斜杠在末尾的特殊处理,统一SQL不进行特殊处理。

  3. DML2DQL:dml 转dql 时,由于正常都是同库不需要转义处理。只对于需要使用源库SQL转换目标库SQL,再转换为DQL的场景需要按上述规则处理转义。