#与MySQL兼容性说明

YashanDB在大部分基本功能上与Oracle数据库兼容,同时,YashanDB也提供了MySQL数据库的兼容性功能。但由于不同数据库的底层架构、产品形态等存在差异,导致适配MySQL数据库的某些特性与适配Oracle数据库的某些特性不能互相兼容。YashanDB通过控制开关的方式,很好地解决了这个问题,从而可以让用户从不同数据库向YashanDB迁移时,无需进行大量地SQL校对和改写工作。

# 控制开关

YashanDB使用SQL_PLUGIN配置参数控制是否开启MySQL兼容的开关。该参数默认值为NONE,表示不开启MySQL兼容(不开启仅代表不支持某些冲突功能,见后文介绍)。

Note

不开启MySQL兼容仅代表不支持某些冲突功能(见后文介绍),除此之外的所有功能将正常使用。

将SQL_PLUGIN的值设为MySQL,表示开启MySQL兼容。

-- 开启MySQL兼容
ALTER SYSTEM SET SQL_PLUGIN = 'MYSQL';ALTER SYSTEM SET SQL_PLUGIN = 'MYSQL' SCOPE = MEMORY;ALTER SYSTEM SET SQL_PLUGIN = 'MYSQL' SCOPE = SPFILE;

-- 关闭MySQL兼容
ALTER SYSTEM SET SQL_PLUGIN = 'NONE';ALTER SYSTEM SET SQL_PLUGIN = 'NONE' SCOPE = MEMORY;ALTER SYSTEM SET SQL_PLUGIN = 'NONE' SCOPE = SPFILE;

其中,SCOPE=MEMORY表示仅在当前实例运行期间配置生效;SCOPE=SPFILE表示当前实例运行期间不生效,仅在重启后配置生效;不指定SCOPE表示配置立即生效,且实例重启后仍生效。

# 影响范围

在YashanDB中开启MySQL兼容性开关后,系统将发生如下变化:

特性 开启前 开启后
多表DELETE 不支持 支持
多表UPDATE 不支持 支持
DELETE table语法 支持 不支持
DELETE table FROM table语法 不支持 支持

示例(单机HEAP表)

-- employees为一张员工信息表,包含如下五条数据
SELECT BRANCH,DEPARTMENT,EMPLOYEE_NO,EMPLOYEE_NAME,SEX,ENTRY_DATE FROM employees;
BRANCH DEPARTMENT EMPLOYEE_NO   EMPLOYEE_NAME SEX   ENTRY_DATE                       
------ ---------- ------------- ------------- ----- -------------------------------- 
0101   000        0101000001    Mask          1     2020-09-09 22:55:32                   
0101   000        0101000002    John          1     2017-12-14 22:55:32                   
0201   010        0201010011    Anna          0     2022-08-10 22:55:32                   
0201   008        0201008003    Jack          1     2021-07-06 22:55:32                   
0101   008        0201008004    Jim           1     2022-11-18 22:55:32                  
 
-- 创建与employees同构的employees2表
DROP TABLE IF EXISTS employees2;
CREATE TABLE employees2 AS SELECT * FROM employees WHERE 1=2;
INSERT INTO employees2 VALUES ('0101','008','0201008003','Jim','0',DATE '2021-11-17');
INSERT INTO employees2 VALUES ('0101','000','0101000002','John','1',DATE '2021-11-17');
COMMIT;
 
-- 开启前
UPDATE employees,employees2 SET EMPLOYEES.EMPLOYEE_NAME = 'TOM',EMPLOYEES2.EMPLOYEE_NAME = 'TOM' WHERE EMPLOYEES.SEX = EMPLOYEES2.SEX;
YAS-04344 multi-table update is not supported
 
DELETE FROM employees,employees2;
YAS-04345 multi-table delete is not supported
 
DELETE employees;
 
DELETE employees FROM employees;
[1:18]YAS-04209 unexpected word FROM
 
-- 开启后
ROLLBACK;
ALTER SYSTEM SET SQL_PLUGIN = 'MYSQL' SCOPE = MEMORY;
 
UPDATE employees,employees2 SET EMPLOYEES.EMPLOYEE_NAME = 'TOM',EMPLOYEES2.EMPLOYEE_NAME = 'TOM' WHERE EMPLOYEES.SEX = EMPLOYEES2.SEX;
 
DELETE FROM employees,employees2;
 
DELETE employees;
[1:17]YAS-04209 unexpected word employees
 
DELETE employees FROM employees;

# 具体兼容项

本文将从如下方面具体说明,在单机部署和行式存储模式下,YashanDB对MySQL数据库的兼容情况:

  • SQL语法
  • 表达式运算
  • FILTER CONDITION
  • 数据类型
  • 内置函数
  • PL
  • 系统视图
  • 字符集
  • SQL引擎
  • 数据库安全

# SQL语法

YashanDB支持MySQL数据库中主流的SQL语法,其他少数因功能性缺失导致的不兼容将报语法不支持错误,此时应联系我们的技术支持提供变通方案。更多SQL语法详细说明请查阅开发手册SQL语句文档。

(1)DML类

SELECT

  • 支持大部分查询功能,包括单表查询,多表查询,子查询,内连接,半连接,外连接,分组及聚合,层次查询等
  • 支持UNION、UNION ALL等集合操作
  • 支持EXPLAIN方式查看执行计划
  • 支持随机抽样查询能力

INSERT

  • 支持单行,多行插入,同时支持指定分区插入
  • 支持INSERT INTO SELECT语句
  • 支持单表插入
  • 支持INSERT ON DUPLICATE KEY UPDATE语法

UPDATE

  • 支持单列和多列更新
  • 支持使用子查询

DELETE

  • 支持单表和多表删除
  • 支持使用子查询

(2)DDL类

HEAP表

  • CREATE TABLE/CREATE TABLE AS
  • ALTER TABLE
  • DROP TABLE
  • TRUNCATE TABLE

临时表

  • 支持临时表的创建与删除

分区表

  • 支持RANGE/LIST/HASH分区
  • 支持ADD|DROP|TRUNCATE PARTITION

约束

  • 包括in_line约束/out_of_line约束
  • UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, (NOT)NULL类型约束

视图

  • CREATE VIEW
  • DROP VIEW
  • 视图支持SELECT,不支持INSERT/UPDATE/DELETE

BTree索引

  • 包括唯一索引和非唯一索引

# 表达式运算

YashanDB包含了主流的计算框架实现对表达式的运算,详见下表:

表达式运算类型 YashanDB MySQL
二元运算加法 支持 支持
二元运算减法 支持 支持
二元运算乘法 支持 支持
二元运算除法 支持 支持
二元运算取余 支持 支持
一元运算取反 支持 支持
位运算与 支持 支持
位运算或 支持 支持
位运算异或 支持 支持

# FILTER CONDITION

YashanDB的FILTER CONDITON类型除了ROWNUM外,完全兼容MySQL数据库的FILTER CONDITON类型。详见下表:

filter YashanDB MySQL
ALL 支持 支持
AND 支持 支持
ANY 支持 支持
BEWTEEN...AND... 支持 支持
EXISTS 支持 支持
GREAT EQUAL 支持 支持
GREATE 支持 支持
IN 支持 支持
IS NOT NULL 支持 支持
IS NULL 支持 支持
LESS 支持 支持
LESS EQUAL 支持 支持
LIKE 支持 支持
NOT 支持 支持
NOT BEWTEEN...AND... 支持 支持
NOT EQUAL 支持 支持
NOT EXISTS 支持 支持
NOT IN 支持 支持
NOT LIKE 支持 支持
NOT RLIKE 支持 支持
OR 支持 支持
QUEAL 支持 支持
RLIKE 支持 支持
ROWNUM 支持 不支持
SOME 支持 支持

# 数据类型

YashanDB实现的数据类型与MySQL数据库对比情况见下表:

数据类型 YashanDB MySQL
BOOLEAN 支持 支持
TINYINT 支持 支持
SMALLINT 支持 支持
MEDIUMINT 不支持 支持
INTEGER 支持 支持
BIGINT 支持 支持
FLOAT 支持 支持
DOUBLE 支持 支持
NUMBER 支持 不支持
DECIMAL / NUMERIC 不支持 支持
DATE 支持 支持
DATETIME 不支持 支持
TIMESTAMP 支持 支持
TIME 支持 支持
YEAR 不支持 支持
INTERVAL YEAR TO MONTH 支持 不支持
INTERVAL DAY TO SECOND 支持 不支持
CHAR 支持 支持
VARCHAR 支持 支持
RAW 支持 不支持
CLOB 支持 不支持
TINYBLOB 不支持 支持
BLOB 支持 支持
MEDIUMBLOB 不支持 支持
TINYTEXT 不支持 支持
TEXT 不支持 支持
LONGTEXT 不支持 支持
BIT 支持 支持
ROWID 支持 不支持
JSON 支持 支持

# 内置函数

YashanDB实现的内置函数与MySQL数据库的内置函数对比情况见下表:

函数类型 支持函数列表 YashanDB MySQL
数学运算函数 ABS、ACOS、ASIN、ATAN、ATAN2、AVG、CEIL/CEILING、COS、COT、DIV、FLOOR、MOD、PI、POW/POWER、RANDOM/RAND、SIGN、SIN、SQRT、TAN、TRUNCATE/TRUNC 支持 支持
字符处理函数 ASCII、BIT_LENGTH、CHR/CHALEASTR 、CHAR_LENGTH/CHARACTER_LENGTH、CONCAT、CONCAT_WS、FIND_IN_SET、GROUP_CONCAT、INSTR、 LCASE/LOWER、 LEFT、LENGTH、LPAD、LTRIM、POSITION、OCTET_LENGTH、RIGHT、RPAD、RTRIM、REPLACE、SUBSTR、SUBSTRING、SUBSTRING_INDEX、TRIM、 UCASE/UPPER 支持 支持
正则匹配函数 REGEXP_LIKE、REGEXP_REPLACE、REGEXP_INSTR、REGEXP_SUBSTR 支持 支持
转换函数 BIN、CAST 支持 支持
聚集函数 AVG、COUNT、GROUP_CONCAT、MAX、MIN、STDDEV、STDDEV_POP、STDDEV_SAMP、SUM、VAR_POP、VAR_SAMP、VAR_SAMP、VARIANCE 支持 支持
窗口函数 FIRST_VALUE、LAG、LAST_VALUE、LEAD、RANK、ROW_NUMBER 支持 支持
时间处理函数 CURRENT_TIMESTAMP、DATE、DAYOFWEEK、DATE_FORMAT、DATE_ADD、EXTRACT、LAST_DAY、LOCALTIMESTAMP、NOW、SYSDATE、TIME、TIMESTAMP、TIMEDIFF、TIMESTAMPDIFF、UTC_TIMESTAMP 支持 支持
条件处理函数 CASE、IF、IFNULL 支持 支持
JSON处理函数 JSON、JSON_ARRAY_GET、JSON_ARRAY_LENGTH、JSON_EXISTS、JSON_FORMAT、JSON_PARSE、JSON_QUERY、JSON_SERIALIZE 支持 不支持
MySQL information函数 BENCHMARK、CHARSET、COERCIBILITY、COLLATION、CONNECTION_ID、 CURRENT_ROLE、CURRENT_USER、DATABASE、ICU_VERSION、LAST_INSERT_ID、ROLES_GRAPHML、ROW_COUNT、SCHEMA、SESSION_USER、USER、VERSION 不支持 支持
MySQL加密和压缩函数 AES_DECRYPT、AES_ENCRYPT、COMPRESS、RANDOM_BYTES、SHA、SHA1、SHA2、STATEMENT_DIGEST、 STATEMENT_DIGEST_TEXT、UNCOMPRESS、UNCOMPRESSED_LENGTH 不支持 支持
其他函数 BITAND/BIT_AND、 BITOR/BIT_OR、BITXOR/BIT_XOR、COALESCE、ISNULL、GREATEST、LEAST、SOUNDEX、MD5 支持 支持

# PL

YashanDB兼容了MySQL数据库大部分的PL功能,但是语法格式上有一定的区别,包括:

  • 数据类型
  • 流程控制
  • 静态SQL
  • 动态SQL
  • 异常处理
    • 系统定义异常
    • 用户自定义异常
  • 游标
  • 存储过程
  • 触发器
    • 支持行级触发器,但不支持语句级触发器
    • 目前仅支持在表上创建触发器,不支持在视图上创建触发器
  • 用户自定义函数
    • SQL语言的UDF
  • JOB

# 字符集

YashanDB目前支持以下字符集:

字符集 YashanDB MySQL
ASCII 支持 支持
GBK 支持 支持
UTF-8 支持 支持
ISO88591 支持 不支持
GB18030 支持 支持

同时支持如下字符集排序方式:

  • ASCII_GENERAL_CS
  • ASCII_GENERAL_CI
  • GBK_GENERAL_CS
  • GBK_GENERAL_CI
  • UTF8_GENERAL_CS
  • UTF8_GENERAL_CI
  • UTF8_PINYIN_CS
  • UTF8_PINYIN_CI
  • ISO88591_GENERAL_CS
  • ISO88591_GENERAL_CI
  • GB18030_GENERAL_CS
  • GB18030_GENERAL_CI
  • GB18030_PINYIN_CS
  • GB18030_PINYIN_CI

# SQL引擎

YashanDB的SQL引擎兼容了MySQL数据库大部分的特性,包括:

  • 支持查询改写
  • 支持预编译语句
  • 支持基于成本的优化器
  • 支持计划生成与展示(EXPLAIN)
  • 支持执行计划缓存
  • 支持执行计划快速参数化
  • 支持Optimizer Hint
  • 支持like和reglike的模糊匹配能力