TiDB 高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 的常用特性和语法。MySQL 的生态工具(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver以及更多)和 MySQL 客户端均可用于 TiDB。由于一些特性已有更适合 TiDB 架构的替代实现方式,另一些特性的使用场景有限、实现与维护成本较高,因此 TiDB 当前暂不支持部分 MySQL 特性。 - SPATIAL(也称为 GIS/GEOMETRY)函数、数据类型和索引 #6347
- 除 ascii、latin1、binary、utf8、utf8mb4 和 gbk 之外的字符集
- XA 语法(TiDB 内部使用两阶段提交,但未通过 SQL 接口暴露)
- CREATE TABLE tblName AS SELECT stmt 语法 #4754
- "Session Tracker: Add GTIDs context to the OK packet"
- 在 TiDB 中,自增列的值(ID)在单个 TiDB 集群内是全局唯一且递增的。若需在多个 TiDB 集群间实现递增,可以使用 AUTO_INCREMENT MySQL 兼容模式 。但分配的 ID 不一定严格连续,因此建议避免混用默认值和自定义值,以防出现 Duplicated Error 错误。
- 你可以通过 tidb_allow_remove_auto_inc 系统变量来允许或禁止移除 AUTO_INCREMENT 列属性。移除列属性时,可使用 ALTER TABLE MODIFY 或 ALTER TABLE CHANGE 语法。
说明
如果在建表时未指定主键,TiDB 会使用 _tidb_rowid 作为行标识。该值的分配与自增列(如存在)共用一个分配器。如果指定自增列为主键,TiDB 会使用该列作为行标识。在这种情况下,可能会出现如下情况:
如上所示,由于共用分配器,id 每次递增 2。该行为在 MySQL 兼容模式下会发生变化,此时不再共用分配器,因此不会跳号。 性能模式(Performance schema)
TiDB 中查询执行计划(EXPLAIN/EXPLAIN FOR)的输出格式、内容和权限设置与 MySQL 有较大差异。
在 TiDB 中,MySQL 系统变量 optimizer_switch 为只读,对查询计划无影响。虽然优化器 Hint 语法与 MySQL 类似,但可用的 Hint 及其实现可能不同。
在 TiDB 中,所有支持的 DDL 变更均可在线完成。但与 MySQL 相比,TiDB 在 DDL 操作上有以下主要限制:
- 使用单条 ALTER TABLE 语句修改同一张表的多个 schema 对象(如列或索引)时,不支持对同一对象进行多次变更。例如,执行 ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1 会报错 Unsupported operate same column/index。
- 不支持通过单条 ALTER TABLE 语句同时修改多个 TiDB 特有的 schema 对象,如 TIFLASH REPLICA、SHARD_ROW_ID_BITS 和 AUTO_ID_CACHE。
- TiDB 不支持通过 ALTER TABLE 修改某些数据类型。例如,不支持将 DECIMAL 类型修改为 DATE 类型。若不支持的数据类型变更,TiDB 会报错 Unsupported modify column: type %d not match origin %d。详情参见 ALTER TABLE。
- ALGORITHM={INSTANT,INPLACE,COPY} 语法在 TiDB 中仅作为断言存在,不会改变 ALTER 算法。详见 ALTER TABLE。
- 不支持对 CLUSTERED 类型的主键进行添加/删除。关于 CLUSTERED 类型主键的更多信息,参见聚簇索引。
- 不支持不同类型的索引(HASH|BTREE|RTREE|FULLTEXT),指定时会被解析并忽略。
- TiDB 支持 HASH、RANGE、LIST 和 KEY 分区类型。对于不支持的分区类型,TiDB 返回 Warning: Unsupported partition type %s, treat as normal table,其中 %s 为具体不支持的分区类型。
- Range、Range COLUMNS、List 和 List COLUMNS 分区表支持 ADD、DROP、TRUNCATE 和 REORGANIZE 操作。其他分区操作会被忽略。
- Hash 和 Key 分区表支持 ADD、COALESCE 和 TRUNCATE 操作。其他分区操作会被忽略。
- 分区表不支持以下语法,更多分区相关内容,参见分区表。
- {CHECK|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD} PARTITION
在 TiDB 中,统计信息收集与 MySQL 不同,会完全重建表的统计信息,因此资源消耗更大,耗时更长。而 MySQL/InnoDB 执行的是相对轻量、耗时较短的操作。 TiDB 不支持以下 SELECT 语法:
- SELECT ... INTO @variable
- SELECT .. GROUP BY expr 不像 MySQL 5.7 那样隐式等同于 GROUP BY expr ORDER BY expr。
TiDB 中的视图不可更新,不支持 UPDATE、INSERT、DELETE 等写操作。
TiDB 支持使用不同的存储引擎创建表。尽管如此,TiDB 描述的元数据仍为 InnoDB 存储引擎,以保证兼容性。
- 兼容性模式,如 Oracle 和 PostgreSQL,会被解析但被忽略。兼容性模式在 MySQL 5.7 中已废弃,在 MySQL 8.0 中已移除。
- ONLY_FULL_GROUP_BY 模式与 MySQL 5.7 存在语义差异。
- MySQL 的 NO_DIR_IN_CREATE 和 NO_ENGINE_SUBSTITUTION SQL 模式为兼容性而接受,但在 TiDB 中无实际作用。
TiDB 与 MySQL 5.7 和 MySQL 8.0 的默认值存在如下差异:
- TiDB 默认排序规则为 utf8mb4_bin。
- MySQL 5.7 默认排序规则为 utf8mb4_general_ci。
- MySQL 8.0 默认排序规则为 utf8mb4_0900_ai_ci。
- TiDB 默认 SQL 模式包含: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 的默认 SQL 模式与 TiDB 相同。
- MySQL 8.0 的默认 SQL 模式包含: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 的默认值:
- Linux 上为 0,表示表名和数据库名在磁盘上按 CREATE TABLE 或 CREATE DATABASE 语句指定的大小写存储,名称比较区分大小写。
- Windows 上为 1,表示表名在磁盘上以小写存储,名称比较不区分大小写。MySQL 在存储和查找时会将所有表名转换为小写。该行为同样适用于数据库名和表别名。
- macOS 上为 2,表示表名和数据库名在磁盘上按 CREATE TABLE 或 CREATE DATABASE 语句指定的大小写存储,但 MySQL 在查找时会将其转换为小写,名称比较不区分大小写。
- explicit_defaults_for_timestamp 的默认值:
- TiDB 的默认值为 ON,且目前仅支持 ON。
TiDB 支持命名时区,具体说明如下:
- TiDB 使用系统当前安装的所有时区规则(通常为 tzdata 包)进行计算,因此可以直接使用所有时区名称,无需导入时区表数据。导入时区表数据不会改变计算规则。
- 目前,MySQL 默认使用本地时区,然后依赖系统内置的当前时区规则(例如夏令时开始时)进行计算。若未导入时区表数据,MySQL 无法通过名称指定时区。
以下列类型为 MySQL 支持但 TiDB 不支持:
- SQL_TSI_*(包括 SQL_TSI_MONTH、SQL_TSI_WEEK、SQL_TSI_DAY、SQL_TSI_HOUR、SQL_TSI_MINUTE 和 SQL_TSI_SECOND,但不包括 SQL_TSI_YEAR)
关于 TiDB 正则表达式与 MySQL 的兼容性,包括 REGEXP_INSTR()、REGEXP_LIKE()、REGEXP_REPLACE() 和 REGEXP_SUBSTR(),参见正则表达式与 MySQL 的兼容性。 TiDB 未实现 MySQL 中已废弃的部分特性,包括:
- 浮点类型指定精度。MySQL 8.0 已废弃该特性,推荐使用 DECIMAL 类型。
- ZEROFILL 属性。MySQL 8.0 已废弃该特性,推荐在应用层对数值进行补零。
CREATE RESOURCE GROUP、DROP RESOURCE GROUP 和 ALTER RESOURCE GROUP 语句
以下用于创建、修改和删除资源组的语句,其支持的参数与 MySQL 不同。详情参见以下文档:
TiDB 与 MySQL InnoDB 悲观事务(锁)的差异
该文档部分内容附带平凯云平台链接,以下简称为外链。若遇到以下分类对应的外链时,请参考以下说明。现将外链文档划分为不同类型,并明确各类文档可作为参考依据的范围: