PingKai Logo下载

与 MySQL 兼容性对比

平凯数据库高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 常用的功能及语法。MySQL 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver 和其他工具)、客户端等均适用于平凯数据库。

但平凯数据库尚未支持一些 MySQL 功能,可能的原因如下:

  • 有更好的解决方案,例如 JSON 取代 XML 函数。
  • 目前对这些功能的需求度不高。
  • 一些功能在分布式系统上的实现难度较大。

除此以外,平凯数据库不支持 MySQL 复制协议,但提供了专用工具用于与 MySQL 复制数据:

  • 从 MySQL 复制:TiDB Data Migration (DM) 是将 MySQL/MariaDB 数据迁移到平凯数据库的工具,可用于增量数据的复制。
  • 向 MySQL 复制:TiCDC 是一款通过拉取 TiKV 变更日志实现的平凯数据库增量数据同步工具,可通过 MySQL sink 将平凯数据库增量数据复制到 MySQL。

不支持的功能特性

  • 事件
  • 全文语法与索引
  • 空间类型的函数(即 GIS/GEOMETRY)、数据类型和索引
  • asciilatin1binaryutf8utf8mb4gbk 的字符集
  • MySQL 追踪优化器
  • XML 函数
  • X-Protocol
  • 列级权限
  • XA 语法(平凯数据库内部使用两阶段提交,但并没有通过 SQL 接口公开)
  • CHECK TABLE 语法
  • CHECKSUM TABLE 语法
  • REPAIR TABLE 语法
  • OPTIMIZE TABLE 语法
  • HANDLER 语句
  • CREATE TABLESPACE 语句
  • "Session Tracker: 将 GTID 上下文信息添加到 OK 包中"
  • 降序索引
  • SKIP LOCKED 语法
  • 横向派生表
  • JOIN 的 ON 子句的子查询

与 MySQL 有差异的特性详细说明

自增 ID

  • 平凯数据库的自增列既能保证唯一,也能保证在单个 TiDB server 中自增,使用 AUTO_INCREMENT MySQL 兼容模式能保证多个 TiDB server 中自增 ID,但不保证自动分配的值的连续性。建议避免将缺省值和自定义值混用,以免出现 Duplicated Error 的错误。

  • 平凯数据库可通过 tidb_allow_remove_auto_inc 系统变量开启或者关闭允许移除列的 AUTO_INCREMENT 属性。删除列属性的语法是:ALTER TABLE MODIFYALTER TABLE CHANGE

mysql> CREATE TABLE t(id INT UNIQUE KEY AUTO_INCREMENT);
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t VALUES();
Query OK, 1 rows affected (0.00 sec)

mysql> INSERT INTO t VALUES();
Query OK, 1 rows affected (0.00 sec)

mysql> INSERT INTO t VALUES();
Query OK, 1 rows affected (0.00 sec)

mysql> SELECT _tidb_rowid, id FROM t;
+-------------+------+
| _tidb_rowid | id   |
+-------------+------+
|           2 |    1 |
|           4 |    3 |
|           6 |    5 |
+-------------+------+
3 rows in set (0.01 sec)

可以看到,由于共用分配器,id 每次自增步长是 2。在 MySQL 兼容模式中改掉了该行为,没有共用分配器,因此不会跳号。

Performance schema

平凯数据库主要使用 Prometheus 和 Grafana 来存储及查询相关的性能监控指标。因此,平凯数据库的 Performance schema 表返回空结果。

查询计划

平凯数据库中,执行计划(EXPLAINEXPLAIN FOR)在输出格式、内容、权限设置方面与 MySQL 有较大差别。

MySQL 系统变量 optimizer_switch 在平凯数据库中是只读的,对查询计划没有影响。你还可以在 optimizer hints 中使用与 MySQL 类似的语法,但可用的 hint 和实现原理可能会有所不同。

详情参见理解平凯数据库执行计划

内建函数

支持常用的 MySQL 内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。

DDL 的限制

平凯数据库中,所有支持的 DDL 变更操作都是在线执行的。与 MySQL 相比,平凯数据库中的 DDL 存在以下限制:

  • 使用 ALTER TABLE 语句修改一个表的多个模式对象(如列、索引和部分表属性)时,TiDB 会按照 SQL 中从左到右的顺序处理,并基于前序子操作产生的临时表结构检查后续子操作。后续子操作可以引用前序子操作刚刚创建、重命名或修改的列或索引。TiDB 不会自动重排用户书写的子操作顺序,如果书写顺序本身不满足依赖关系,语句会返回相应错误。

  • 平凯数据库不保证支持所有 multi-action ALTER TABLE 子操作组合。涉及聚簇主键物理存储语义变更、不支持的列类型转换、复杂数据重组、分区表或全局索引等特殊对象的组合,仍可能返回不支持错误。

  • ALTER TABLE 不支持少部分类型的变更。比如,平凯数据库不支持从 DECIMALDATE 的变更。当遇到不支持的类型变更时,平凯数据库将会报 Unsupported modify column: type %d not match origin %d 的错误。更多细节,请参考 ALTER TABLE

  • 平凯数据库支持通过 MODIFY COLUMNCHANGE COLUMN 修改 NONCLUSTERED PRIMARY KEY 成员列的数据类型,包括单列非聚簇主键和复合非聚簇主键中的成员列。该操作属于在线 Reorg DDL,会重组受影响的主键索引和相关二级索引。对于 CLUSTERED PRIMARY KEY,如果列类型变更会影响 row handle、行键编码或数据物理组织,则仍不支持。

  • 平凯数据库中,ALGORITHM={INSTANT,INPLACE,COPY} 语法只作为一种指定,并不更改 ALTER 算法,详情参阅 ALTER TABLE

  • 不支持添加或删除 CLUSTERED 类型的主键,也不支持聚簇主键和非聚簇主键互相转换。对于非聚簇主键,平凯数据库支持添加、删除,以及在同一条 ALTER TABLE 语句中通过 DROP PRIMARY KEY, ADD PRIMARY KEY (...) NONCLUSTERED 替换主键。要了解关于 CLUSTERED 主键的详细信息,请参考聚簇索引

  • 不支持指定不同类型的索引 (HASH|BTREE|RTREE|FULLTEXT)。若指定了不同类型的索引,平凯数据库会解析并忽略这些索引。

  • 分区表支持 HASHRANGELISTKEY 分区类型。对于不支持的分区类型,平凯数据库会报 Warning: Unsupported partition type %s, treat as normal table 错误,其中 %s 为不支持的具体分区类型。

  • Range、Range COLUMNS、List、List COLUMNS 分区表支持 ADDDROPTRUNCATEREORGANIZE 操作,其他分区操作会被忽略。

  • Hash 和 Key 分区表支持 ADDCOALESCETRUNCATE 操作,其他分区操作会被忽略。

  • 平凯数据库不支持以下分区表语法:

    • SUBPARTITION
    • {CHECK|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD} PARTITION

    更多详情,请参考分区表文档

ANALYZE TABLE

平凯数据库中的信息统计与 MySQL 中的有所不同:平凯数据库中的信息统计会完全重构表的统计数据,语句消耗较多资源,执行过程较长,但在 MySQL/InnoDB 中,它是一个轻量级语句,执行过程较短。

更多信息统计的差异请参阅 ANALYZE TABLE

SELECT 的限制

平凯数据库的 SELECT 语法有以下限制:

  • 不支持 SELECT ... INTO @变量 语法。
  • 平凯数据库中的 SELECT .. GROUP BY expr 的返回结果与 MySQL 5.7 并不一致。MySQL 5.7 的结果等价于 GROUP BY expr ORDER BY expr

详情参见 SELECT

UPDATE 语句

详情参见 UPDATE

CREATE TABLE ... SELECT 语句

平凯数据库支持 CREATE TABLE ... SELECT 语法,但与 MySQL 相比仍有以下差异:

  • 该语句依赖 tidb_enable_dist_task。关闭分布式执行框架时,CREATE TABLE ... SELECT 不可用。
  • 平凯数据库不支持以 VALUES 语句作为 CREATE TABLE ... SELECT 的数据来源。
  • tidb_create_from_select_using_importON 时,IGNOREREPLACE 两种重复键处理方式暂不支持。

详情参见 CREATE TABLE

视图

平凯数据库中的视图不可更新,不支持 UPDATEINSERTDELETE 等写入操作。

触发器

平凯数据库支持 CREATE TRIGGERDROP TRIGGERSHOW TRIGGERSSHOW CREATE TRIGGER。关于语法、示例和使用说明,请参见 CREATE TRIGGER

用户自定义函数

平凯数据库支持以下两类用户自定义函数:

  • 不带 SONAMECREATE FUNCTION,即通过 SQL 定义函数体。该能力由全局系统变量 tidb_enable_procedure 控制。

  • 基于 SONAME 的 Loadable UDF。用户可以通过 CREATE FUNCTION ... SONAME 注册共享库函数,并从 plugin_dir 指定的目录加载 .so 文件。当前支持 INTEGERREALDECIMALSTRING 返回类型。

详情参见用户自定义函数(UDF)

临时表

详见平凯数据库本地临时表与 MySQL 临时表的兼容性

字符集和排序规则

  • 关于平凯数据库对字符集和排序规则的支持情况,详见字符集和排序规则

  • 关于 GBK 字符集与 MySQL 的兼容情况,详见 GBK 兼容情况

  • 平凯数据库继承表中使用的字符集作为国家字符集。

存储引擎

  • 仅在语法上兼容创建表时指定存储引擎,实际上平凯数据库会将元信息统一描述为 InnoDB 存储引擎。平凯数据库支持类似 MySQL 的存储引擎抽象,但需要在系统启动时通过 --store 配置项来指定存储引擎。

SQL 模式

平凯数据库支持大部分 SQL 模式。不支持的 SQL 模式如下:

  • 不支持兼容模式,例如:OraclePostgreSQL(平凯数据库解析但会忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。
  • 平凯数据库的 ONLY_FULL_GROUP_BY 模式与 MySQL 5.7 相比有细微的语义差别
  • NO_DIR_IN_CREATENO_ENGINE_SUBSTITUTION 仅用于解决与 MySQL 的兼容性问题,并不适用于平凯数据库。

默认设置

平凯数据库的默认设置与 MySQL 5.7 和 MySQL 8.0 有以下区别:

  • 字符集:

    • 平凯数据库默认:utf8mb4
    • MySQL 5.7 默认:latin1
    • MySQL 8.0 默认:utf8mb4
  • 排序规则:

    • 平凯数据库中 utf8mb4 字符集默认:utf8mb4_bin
    • MySQL 5.7 中 utf8mb4 字符集默认:utf8mb4_general_ci
    • MySQL 8.0 中 utf8mb4 字符集默认:utf8mb4_0900_ai_ci
  • SQL mode:

    • 平凯数据库默认:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    • MySQL 5.7 默认与平凯数据库相同。
    • MySQL 8.0 默认 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • lower_case_table_names

    • 平凯数据库默认:2,且仅支持设置该值为 2
    • MySQL 默认如下:
      • Linux 系统中该值为 0,表示表名和数据库名按照在 CREATE TABLECREATE DATABASE 语句中指定的字母大小写存储在磁盘上,且名称比较时区分大小写。
      • Windows 系统中该值为 1,表示表名按照小写字母存储在磁盘上,名称比较时不区分大小写。MySQL 在存储和查询时将所有表名转换为小写。该行为也适用于数据库名称和表的别名。
      • macOS 系统中该值为 2,表示表名和数据库名按照在 CREATE TABLECREATE DATABASE 语句中指定的字母大小写存储在磁盘上,但 MySQL 在查询时将它们转换为小写。名称比较时不区分大小写。
  • explicit_defaults_for_timestamp

    • 平凯数据库默认:ON,且仅支持设置该值为 ON
    • MySQL 5.7 默认:OFF
    • MySQL 8.0 默认:ON

日期时间处理的区别

平凯数据库与 MySQL 在日期时间处理上有如下差异:

  • 平凯数据库采用系统当前安装的所有时区规则进行计算(一般为 tzdata 包),不需要导入时区表数据就能使用所有时区名称,导入时区表数据不会修改计算规则。

  • MySQL 默认使用本地时区,依赖于系统内置的当前的时区规则(例如什么时候开始夏令时等)进行计算;且在未导入时区表数据的情况下不能通过时区名称来指定时区。

类型系统

MySQL 支持 SQL_TSI_*(包括 SQL_TSI_MONTHSQL_TSI_WEEKSQL_TSI_DAYSQL_TSI_HOURSQL_TSI_MINUTESQL_TSI_SECOND,但不包括 SQL_TSI_YEAR),但平凯数据库不支持。

正则函数

关于平凯数据库中正则函数 REGEXP_INSTR()REGEXP_LIKE()REGEXP_REPLACE()REGEXP_SUBSTR() 与 MySQL 的兼容情况,请参考正则函数与 MySQL 的兼容性

MySQL 弃用功能导致的不兼容问题

平凯数据库不支持 MySQL 中标记为弃用的功能,包括:

  • 指定浮点类型的精度。MySQL 8.0 弃用了此功能,建议改用 DECIMAL 类型。
  • ZEROFILL 属性。MySQL 8.0 弃用了此功能,建议在业务应用中填充数字值。

CREATE RESOURCE GROUPDROP RESOURCE GROUPALTER RESOURCE GROUP

平凯数据库资源组创建与修改语句的语法与 MySQL 官方不同,详情参见: