#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;
Copied!

例如,YashanDB的语法体系中,SELECT语句必须包含FROM子句,而MySQL的语法允许SELECT语句不带FROM子句。通过以上语句切换成MySQL语法模式后,执行以下语句,将返回当前会话的登录用户名,而不是报错:

SELECT USER();
Copied!

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模式下会被视为注释,对语句执行不产生影响