本次調研主要考慮在應用層面,用 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 等寫入操作。
