热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql与TiDB的兼容性对比

与MySQL兼容性对比概览TiDB100%兼容MySQL5.7协议、MySQL5.7常用的功能及语法。MySQL5.7生态中的系统工具(PHPMyAdmin、Nav

与 MySQL 兼容性对比概览

TiDB 100% 兼容 MySQL 5.7 协议、MySQL 5.7 常用的功能及语法。MySQL 5.7 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)、客户端等均用于 TiDB。

由于 TiDB 是一款分布式数据库,MySQL 5.7 中的部分特性因工程实现难度较大,投入产出比较低等多种原因在 TiDB 中未能实现或者仅兼容语法但功能并没有实现,因此使用过程中请特别注意。例如:CREATE TABLE 语句中 ENGINE,仅兼容语法,功能并没有实现,因此 TiDB 中没有 ENGINE 这类的概念。

注意:

本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于安全特性、悲观事务模型 相关的兼容信息请查看各自具体页面。

不支持的功能特性

存储过程与函数
触发器
事件
自定义函数
外键约束
全文/空间函数与索引
非 ascii/latin1/binary/utf8/utf8mb4 的字符集
SYS schema
MySQL 追踪优化器
XML 函数
X Protocol
Savepoints
列级权限
XA 语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开)
CREATE TABLE tblName AS SELECT stmt 语法
CREATE TEMPORARY TABLE 语法
CHECK TABLE 语法
CHECKSUM TABLE 语法

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

自增 ID
TiDB 的自增列仅保证自增且唯一、但不保证自动分配的值的连续性,建议不要将缺省值和自定义值混用,若混用可能会收 Duplicated Error 的错误信息。

TiDB 在工程实现上会在每一个 tidb-server 实例上缓存一段 ID 的值用于给表的自增列分配值,缓存 ID 的个数由表的 AUTO_ID_CACHE 确定,默认值:30000。请特别注意:自增列和 _tidb_rowid都会消耗缓存的 ID。如果 INSERT 语句中所要求的连续的 ID 个数大于 AUTO_ID_CACHE 的值时系统会自动调整 AUTO_ID_CACHE 的值以确保该语句能正常执行。

TiDB 可通过 tidb_allow_remove_auto_inc 系统变量开启或者关闭删除列的 AUTO_INCREMENT 属性。删除列属性的语法是:alter table modify 或 alter table change 。

注意:

tidb_allow_remove_auto_inc 要求版本号 >= v2.1.18 或者 >= v3.0.4。
表的 AUTO_ID_CACHE 属性要求版本号 >= v3.0.14 或者 >= v3.1.2 或者 >= v4.0.rc-2。
若创建表时没有指定主键时,TiDB 会使用 _tidb_rowid 来标识行,该数值的分配会和自增列(如果存在的话)共用一个分配器。如果指定了自增列为主键,则 TiDB 会用该列来标识行。因此会有以下的示例情况:
Copy
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, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select _tidb_rowid, id from t;
±------------±-----+
| _tidb_rowid | id |
±------------±-----+
| 4 | 1 |
| 5 | 2 |
| 6 | 3 |
±------------±-----+
3 rows in set (0.01 sec)
Performance schema
TiDB 主要使用 Prometheus 和 Grafana 来存储及查询相关的性能监控指标,所以 Performance schema 部分表是空表。
查询计划
EXPLAIN/EXPLAIN FOR 输出格式、内容、权限设置与 MySQL 有比较大的差别,参见理解 TiDB 执行计划。
内建函数
支持常用的 MySQL 内建函数,有部分函数并未支持,参考 SQL 语法文档。
DDL 的限制
Add Index

同一条 SQL 语句不支持创建多个索引。
仅在语法在支持创建不同类型的索引 (HASH/BTREE/RTREE),功能未实现。
Add Column

不支持设置PRIMARY KEY 及 UNIQUE KEY,不支持设置 AUTO_INCREMENT 属性。可能输出的错误信息:unsupported add column ‘%s’ constraint PRIMARY/UNIQUE/AUTO_INCREMENT KEY
Drop Column

不支持删除主键列及索引列,可能输出的错误信息:Unsupported drop integer primary key/column a with index covered。
Drop Primary Key

仅支持删除建表时启用了 alter-primary-key 配置项的表的主键。可能输出的错误信息: Unsupported drop primary key when alter-primary-key is false。
Order By 忽略所有列排序相关的选项。

Change/Modify Column

不支持有损变更,比如从 BIGINT 变为 INTEGER,或者从 VARCHAR(255) 变为 VARCHAR(10),可能输出的错误信息:length %d is less than origin %d。
不支持修改 DECIMAL 类型的精度,可能输出的错误信息:can’t change decimal column precision。
不支持更改 UNSIGNED 属性,可能输出的错误信息:can’t change unsigned integer to signed or vice versa。
只支持将 CHARACTER SET 属性从 utf8 更改为 utf8mb4
LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}

仅在语法上支持,功能未实现,故所有的 DDL 都不会锁表。
ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}

支持 ALGORITHM=INSTANT 和 ALGORITHM=INPLACE 语法,但行为与 MySQL 有所不同,MySQL 中的一些 INPLACE 操作在 TiDB 中的 是INSTANT 操作。
仅在语法上支持 ALGORITHM=COPY,功能未实现,会返回警告信息。
单条 ALTER TABLE 语句中无法完成多个操作。例如:不能用一条语句来添加多个列或多个索引。可能输出的错误信息:Unsupported multi schema change。

Table Option 仅支持AUTO_INCREMENT、CHARACTER SET、COLLATE、COMMENT,不支持以下语法:

WITH/WITHOUT VALIDATION
SECONDARY_LOAD/SECONDARY_UNLOAD
CHECK/DROP CHECK
STATS_AUTO_RECALC/STATS_SAMPLE_PAGES
SECONDARY_ENGINE
ENCRYPTION
Table Partition 分区类型支持 Hash、Range;支持 Add/Drop/Truncate/Coalesce;忽略其他分区操作,可能错误信息:Warning: Unsupported partition type, treat as normal table,不支持以下语法:

PARTITION BY LIST
PARTITION BY KEY
SUBPARTITION
{CHECK|EXCHANGE|TRUNCATE|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD|REORGANIZE} PARTITION
ANALYZE TABLE
ANALYZE TABLE 语句会完全重构表的统计数据,语句执行过程较长,但在 MySQL/InnoDB 中,它是一个轻量级语句,执行过程较短。
视图
不支持 UPDATE、INSERT、DELETE 等写入操作。
存储引擎
仅在语法上兼容创建表时指定存储引擎,实际上 TiDB 会将元信息统一描述为 InnoDB 存储引擎。TiDB 支持类似 MySQL 的存储引擎抽象,但需要在系统启动时通过–store 配置项来指定存储引擎。
SQL 模式
不支持兼容模式,例如:ORACLE 和 POSTGRESQL,MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。

ONLY_FULL_GROUP_BY 与 MySQL 5.7 相比有细微的语义差别。

NO_DIR_IN_CREATE 和 NO_ENGINE_SUBSTITUTION MySQL 用于解决兼容问题,并不适用于 TiDB。

默认设置
字符集:

TiDB 默认:utf8mb4。
MySQL 5.7 默认:latin1。
MySQL 8.0 默认: utf8mb4。
排序规则:

TiDB 中 utf8mb4 字符集默认: utf8mb4_bin。
MySQL 5.7 中 utf8mb4 字符集默认: utf8mb4_general_ci。
MySQL 8.0 中 utf8mb4 字符集默认: utf8mb4_0900_ai_ci。
foreign_key_checks:

TiDB 默认: OFF,且仅支持设置该值为 OFF。
MySQL 5.7 默认: ON。
SQL mode:

TiDB 默认: 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 默认 与 TiDB 相同。
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:

TiDB 默认:2,且仅支持设置该值为 2。
MySQL 默认如下:
Linux 系统中该值为 0
Windows 系统中该值为 1
macOS 系统中该值为 2
explicit_defaults_for_timestamp:

TiDB 默认:ON,且仅支持设置该值为 ON。
MySQL 5.7 默认:OFF。
MySQL 8.0 默认:ON。

日期时间处理的区别

时区
TiDB 采用系统当前安装的所有时区规则进行计算(一般为 tzdata 包), 不需要导入时区表数据就能使用所有时区名称,无法通过导入时区表数据的形式修改计算规则。

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

零月和零日

与 MySQL 一样,TiDB 默认启用了 NO_ZERO_DATE 和 NO_ZERO_IN_DATE 模式,但是 TiDB 与 MySQL 在处理这两个 SQL 模式有以下不同:
TiDB 在非严格模式下启用以上两个 SQL 模式,插入零月/零日/零日期不会给出警告,MySQL 则会给出对应的警告。
TiDB 在严格模式下,启用了 NO_ZERO_DATE ,仍然能够插入零日期;如果启用了 NO_ZERO_IN_DATE 则无法插入零月/零日日期。MySQL 在严格模式下则都无法插入两种类型的日期。

类型系统

不支持 FLOAT4/FLOAT8。

不支持 FIXED (alias for DECIMAL)。

不支持 SERIAL (alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE)。

不支持 SQL_TSI_*(包括 SQL_TSI_YEAR、SQL_TSI_MONTH、SQL_TSI_WEEK、SQL_TSI_DAY、SQL_TSI_HOUR、SQL_TSI_MINUTE 和 SQL_TSI_SECOND)。

参考资料

https://pingcap.com/docs-cn/stable/mysql-compatibility/


推荐阅读
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • 本文介绍如何在阿里云环境中利用 Docker 容器化技术部署一个简单的 Flask Web 应用,并确保其可通过互联网访问。内容涵盖 Python 代码编写、Dockerfile 配置、镜像构建及容器运行等步骤。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 1.前言PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议&#x ... [详细]
  • Python默认字符解析:深入理解Python中的字符串处理
    在Python中,字符串是编程中最基本且常用的数据类型之一。尽管许多初学者是从C语言开始接触字符串,通常通过经典的“Hello, World!”程序入门,但Python对字符串的处理方式更为灵活和强大。本文将深入探讨Python中的字符串处理机制,包括字符串的创建、操作、格式化以及编码解码等方面,帮助读者全面理解Python字符串的特性和应用。 ... [详细]
author-avatar
1021365712_3a478e
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有