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),转换规则如下:
源库NBES |
目标库类型 |
目标库NBES |
处理方式 |
说明 |
|---|---|---|---|---|
有 |
MySQL系 |
无 |
反斜杠double处理 |
将 |
有 |
MySQL系 |
有 |
透传 |
直接透传,不做处理 |
有 |
Oracle系/PG系 |
— |
透传 |
直接透传,不做处理 |
无 |
MySQL系 |
无 |
透传 |
直接透传,不做处理 |
无 |
MySQL系 |
有 |
转义序列消费 |
将 |
无 |
Oracle系/PG系 |
— |
转义序列消费 |
将 |
1.3.7.2.2. Oracle源库转义规则
当源库为Oracle时,Oracle中反斜杠始终为普通字符,转换规则如下:
目标库类型 |
目标库NBES |
处理方式 |
说明 |
|---|---|---|---|
MySQL系 |
无 |
反斜杠double处理 |
将 |
MySQL系 |
有 |
透传 |
直接透传,不做处理 |
Oracle系/PG系 |
— |
透传 |
直接透传,不做处理 |
1.3.7.2.3. 支持的转义序列
当需要进行转义序列消费处理时,统一SQL支持以下MySQL标准转义序列:
转义序列 |
含义 |
ASCII值 |
|---|---|---|
|
NUL 空字符 |
0x00 |
|
退格 |
0x08 |
|
水平制表符(TAB) |
0x09 |
|
换行(LF) |
0x0A |
|
回车(CR) |
0x0D |
|
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. 注意事项
LIKE正则匹配:对于MySQL中LIKE正则对于字符串的两层解析特殊情况,统一SQL不统一处理, 每个库自行特殊处理。
LIKE正则匹配:对于MySQL中LIKE正则对于字符串中反斜杠在末尾的特殊处理,统一SQL不进行特殊处理。
DML2DQL:dml 转dql 时,由于正常都是同库不需要转义处理。只对于需要使用源库SQL转换目标库SQL,再转换为DQL的场景需要按上述规则处理转义。