#MySQL兼容模式参考手册
# MySQL兼容模式简介
YashanDB数据库管理系统提供了丰富的标准SQL语句、常用内置函数等功能,与主流的数据库产品高度兼容。但由于不同的数据库的概念、语法存在较大的差异甚至冲突。导致一个数据库产品无法同时兼容多个其他数据库产品的功能。因此,YashanDB提供了MySQL兼容模式,在该模式下,用户输入的SQL命令,将优先按照MySQL的语法体系进行解析,如果MySQL的语法与YashanDB现有语法存在冲突时,MySQL的语法将覆盖YashanDB语法。
MySQL兼容模式仅适用于单机部署。
# 通信协议兼容
YashanDB数据库管理系统通信协议与MySQL协议不同,因此MySQL的客户端无法直接连接YashanDB服务。YashanDB数据库管理系统自23.3版本开始,支持在YashanDB服务进程中启动单独的MySQL监听服务,该服务可打开单独的监听端口,处理通过MySQL协议向YashanDB服务端发起的连接、执行等协议命令。
配置方法请参考MySQL监听服务。
# 语法兼容
YashanDB支持将语法体系切换为MySQL体系。用户通过客户端连接到YashanDB服务后,可通过以下命令将语法体系切换为MySQL体系:
ALTER SESSION SET COMPAT_VECTOR=MYSQL;
例如,YashanDB的语法体系中,SELECT语句必须包含FROM子句,而MySQL的语法允许SELECT语句不带FROM子句。通过以上语句切换成MySQL语法模式后,执行以下语句,将返回当前会话的登录用户名,而不是报错:
SELECT USER();
Note:
通过基于YashanDB驱动程序开发的客户端工具(例如yasql工具)连接YashanDB的会话,其默认的语法模式为YashanDB语法模式,需要手动设置COMPAT_VECTOR=MYSQL才能切换成MySQL语法模式。
通过基于MySQL协议开发的客户端工具(例如mysql、mysqldump等)连接到YashanDB的会话,默认为MySQL语法模式。
当会话的语法模式切换为MySQL后,语法解析、语句执行将按照MySQL 5.7的风格。与YashanDB可能存在以下差异:
词法
例如MySQL模式下,反引号(`)表示对象名,单引号(')表示字符串,双引号(")默认表示字符串,但在sql_mode中包含ANSI_QUOTES时,表示对象名。而YashanDB模式下,双引号表示对象,单引号表示字符串。
对象的概念
例如create Database命令,在MySQL模式下表示创建一个Schema。
数据类型
例如Bool类型,在MySQL模式下表示Tinyint(1)。
数据定义语言
例如create Table命令,在MySQL模式下会兼容Engine、Character set等选项,不再支持pctfree等选项。
数据操作语言
例如MySQL模式下支持select语句不带From子句。
权限
例如执行select for update语句,在MySQL模式下需要用户具有表的读权限,以及插入、删除、更新三者之中任意一种权限。而在YashanDB模式下,select语句需要读(read)权限,select for update语句需要单独的select权限。
Caution:
YashanDB 23.3未能覆盖MySQL的所有语法及行为,因此,部分功能语句在执行时,仍会按照YashanDB风格解析和执行。
部分YashanDB的功能,MySQL不支持,这类语句在MySQL模式下不会产生歧义,因此在MySQL模式下仍然可以执行,例如查询语句的集合操作(MINUS、INTERSECTS)、层次查询(CONNECT BY)。
# 保留字兼容
YashanDB兼容了MySQL数据库大部分保留字,但目前个别保留字仍存在一定区别,包括:
- CONNECT
- EXCEPT
- IF
- INTERSECT
- MINUS
- OF
- PUBLIC
- ROW
- ROWS
- START
- SYSDATE
# 规格
YashanDB数据库在MySQL模式下,绝大多数规格与YashanDB模式保持一致,以下仅列出与YashanDB模式下存在差异的规格。
# 对象规格
规格名称 | 规格类型 | 最大值 |
---|---|---|
user数量 | 最大值 | 10240 - 内置user数量 - database/schema数量 |
database\schema数量 | 最大值 | 10240 - 内置user数量 - 普通user数量 |
user名称长度 | 最大值 | 60Bytes |
# 数据类型规格
数据类型 | 类型长度 | 取值范围 | 说明 |
---|---|---|---|
TINYINT | 1Bytes | -128 ~ 127 | 小整数值,例如boolean,在括号中规定最大位数。 |
SMALLINT | 2Bytes | -215 (-32,768) ~ 215 - 1 (32,767) | 无 |
MEDIUMINT | 4Bytes | -223 (-8,388,608) ~ 223 - 1 (8,388,607) | 无 |
INTEGER | 4Bytes | -231 (-2,147,483,648) ~ 231 - 1 (2,147,483,647) | 大整数值。 |
BIGINT | 8Bytes | -263 (-9,223,372,036,854,775,808) ~ 263-1 (9,223,372,036,854,775,807) | 极大整数值。 |
FLOAT | 4Bytes | 32位单精度浮点数 负数:-3.402823E38 ~ -1.401298E-45 正数:1.401298E-45 ~ 3.402823E38,0 | 表示单精度浮点数,在括号中规定最大位数,在d参数中规定小数点右侧的最大位数。 BINARY_FLOAT/REAL为FLOAT的别名,行为完全同FLOAT。 |
DOUBLE | 8Bytes | 64位双精度浮点数 负数: -1.797693134862315807E308 ~ -4.94065645841247E-324 正数:4.94065645841247E-324 ~ 1.797693134862315807E308,0 | 表示双精度浮点数。 BINARY_DOUBLE为DOUBLE的别名,行为完全同DOUBLE。 |
DECIMAL | 20Bytes | NUMBER(p,s) p:1 ~ 38 s:-84 ~ 127 | 用于精度要求非常高的计算,以二进制存储,因此实际存储长度、与表达的数据范围需要换算。 DECIMAL/NUMERIC为NUMBER的别名,行为完全同NUMBER。 |
CHAR(SIZE) | SIZE字符 | 0-255 | CHARACTER为CHAR的别名,行为完全同CHAR。 |
VARCHAR(SIZE) | SIZE*字符最大宽度 最大值不超过32000 | 无 | CHARACTER VARYING为VARCHAR的别名,行为完全同VARCHA |
TINYTEXT/TINYBLOB | 0-255字节 | 无 | 无 |
TEXT/BLOB | 0-65535字节 | 无 | 无 |
MEDIUMTEXT/MEDIUMBLOB | 0-16777215字节 | 无 | 无 |
LONGTEXT/LONGBLOB | 0-4294967295字节 | 无 | 无 |
DATE | 8Bytes | 1-1-1 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD [HH24:MI:SS] |
TIME | 8Bytes | 00:00:00.000000 ~ 23:59:59.999999 | 时分秒 微秒 |
TIMESTAMP | 8Bytes | 1-1-1 00:00:00.000000 ~ 9999-12-31 23:59:59.999999 | YYYY-MM-DD HH24:MI:SS.FF TIMESTAMP默认输入微秒精度为9位,因此输入支持最大值为9999-12-31 23:59:59.999999999,但输出时微秒只显示6位(其余四舍五入),所以最大值为9999-12-31 23:59:59.999999,溢出则报错。 |
BIT | 1~8Bytes | 同BIGINT规格 | 列存无此类型。 |
BINARY(SIZE) | 存储: 1~8000Bytes 运算: 1~32000Bytes | 无 | 无 |
VARBINARY(SIZE) | 存储: 1~8000Bytes 运算: 1~32000Bytes | 无 | 无 |
# 功能约束
使用MySQL模式时,存在如下约束:
约束项 | 约束行为 |
---|---|
开启MySQL兼容模式 | 仅适用于单机部署 |
列存表 | MySQL模式下仅支持创建行存表 |
用户登录 | 直接允许MySQL模式下创建的用户登录 如需使用YashanDB模式下创建的用户登录,则要求客户端支持SHA256插件 |
用户删除和修改 | 不允许在MySQL模式下删除和修改YashanDB模式下创建的用户 |
对象名称 | lower_case_table_names参数暂不生效,schema、表、视图、列均会自动转成大写,并且系统视图中对象名称匹配严格区分大小写 |
Binary/Blob类型文本协议 | 当客户端与服务端字符集不一致时,会按服务端字符集转码,可能与客户端预期不一致 |
字符集 | 仅支持实例级字符集设置,schema/table/column级的字符集均只为语法兼容 |
排序集 | 仅支持实例级排序集设置,schema/table/column级的排序集均只为语法兼容 |
全局变量 | 全局变量查询和设置仅为语法兼容,除字符集、自动提交外,大部分实际不会生效 |
SQL_MODE | 除ANSI_QUOTES、NO_BACKSLASH_ESCAPES、PIPES_AS_CONCAT、REAL_AS_FLOAT外,其它SQL_MODE无论是否设置,均不会对数据库的行为产生影响,实际执行效果与YashanDB模式一致 |
可执行注释 | 可执行注释在MySQL模式下会被视为注释,对语句执行不产生影响 |