#与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的模糊匹配能力