本次调研主要考虑在应用层面,用 TiDB 替代 MySQL 的可行性。
1 数据类型
1.1 数值类型
| Type | TiDB | MySQL |
|---|---|---|
| BIT | √ | √ |
| BOOL/BOOLEAN | √ | √ |
| TINYINT | x | √ |
| SMALLINT | √ | √ |
| MEDIUMINT | √ | √ |
| INT/INTEGER | √ | √ |
| BIGINT | √ | √ |
| FLOAT | √ | √ |
| DOUBLE | √ | √ |
| DECIMAL | √ | √ |
在 TiDB 中,
FLOAT数据类型默认的精度是 8 位,这与 MySQL 不同。在 MySQL 中,FLOAT数据类型默认的精度是 6 位。
1.2 日期和时间类型
| Type | TiDB | MySQL |
|---|---|---|
| DATE | √ | √ |
| TIME | √ | √ |
| DATETIME | √ | √ |
| TIMESTAMP | √ | √ |
| YEAR | √ | √ |
1.3 字符串类型
| Type | TiDB | MySQL |
|---|---|---|
| CHAR/VARCHAR | √ | √ |
| BINARY/VARBINARY | √ | √ |
| TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB | √ | √ |
| TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT | √ | √ |
| ENUM | √ | √ |
| SET | √ | √ |
1.4 其他类型
| Type | TiDB | MySQL |
|---|---|---|
| JSON | √ | √ |
| Spatial Data Types | x | √ |
TiDB v4.0(Stable)版本中JSON功能为实验特性,不建议在生产环境中使用。
2、数据比较(函数与操作符)
TiDB 中函数和操作符使用方法与
MySQL基本一致。涉及上一小节所述数据类型的比较,TiDB 与MySQL v5.7大致相同。下面列出部分差异:
2.1 TiDB 不支持函数
- 字符串函数
- LOAD_FILE()
- MATCH
- SOUNDEX()
- SOUNDS LIKE
- WEIGHT_STRING()
- 加密和压缩函数
- 在 MySQL 5.7 中被废弃,并且已在 MySQL 8.0 中移除的函数:DES_DECRYPT()、DES_ENCRYPT()、OLD_PASSWORD() 和 ENCRYPT()
- VALIDATE_PASSWORD_STRENGTH()
- 其他仅在
MySQL企业版中支持的函数
- 信息函数
- CHARSET()
- COERCIBILITY()
- COLLATION()
JSON函数(TiDB v4.0版本的实验性功能)- JSON_MERGE_PATCH
- JSON_PRETTY
- JSON_ARRAYAGG
GROUP BY修饰符,例如WITH ROLLUP,将来会提供支持(参阅#4250)- 其他函数
- GET_LOCK()
- RELEASE_LOCK()
- UUID_SHORT()
- MASTER_WAIT_POS()
3 数据结构
3.1 外键约束
为了便于其他数据库向TiDB 迁移,TiDB 支持在建表时创建外键约束,也支持使用ALTER TABLE命令来删除外键(DROP FOREIGN KEY)和添加外键(ADD FOREIGN KEY)。但是,TiDB 不会在DML语句中对外键进行约束检查。
3.2 视图
TiDB 中把视图视为一张虚拟表,用于隐藏底层表敏感字段和数据,以及简化查询。 TiDB 在真正执行查询视图时,会将视图展开成创建视图时定义的 SELECT 语句,进而执行展开后的查询语句。
对视图的操作仅限于create、drop以及使用SHOW CREATE TABLE view_name、SHOW CREATE VIEW view_name、INFORMATION_SCHEMA.VIEWS等查看视图的相关信息。
TiDB 中视图为只读视图,不支持对视图进行 UPDATE、INSERT、DELETE、TRUNCATE 等写入操作。
