MySQL 兼容性说明
Doris 高度兼容 MySQL 协议与标准 SQL 语法,业务系统、BI 工具与运维脚本通常无需大幅改动即可接入。但 Doris 作为面向分析的 MPP 数据库,在数据类型、建表语法、数据模型、DML 行为等方面与 MySQL 仍存在差异。
本文从迁移与日常使用两个视角出发,整理 Doris 与 MySQL 的主要差异点,帮助你快速定位写法或行为上的不兼容之处。
适用读者与场景
- 计划将 MySQL 应用或数仓迁移到 Doris,需要快速评估 SQL 兼容范围。
- 在 Doris 上沿用 MySQL 习惯写 SQL 时遇到语法或行为差异。
- 需要核对某个数据类型、DDL/DML 语句在 Doris 中的支持情况。
数据类型差异
下面按数字、日期、字符串、JSON 与 Doris 特有类型分组,列出与 MySQL 的差异。
数字类型
| 类型 | MySQL | Doris |
|---|---|---|
| Boolean | - 支持 - 范围:0 代表 false,1 代表 true | - 支持 - 关键字:Boolean - 范围:0 代表 false,1 代表 true |
| Bit | - 支持 - 范围:1 ~ 64 | 不支持 |
| Tinyint | - 支持 - 支持 signed、unsigned - 范围:signed 为 -128 ~ 127,unsigned 为 0 ~ 255 | - 支持 - 只支持 signed - 范围:-128 ~ 127 |
| Smallint | - 支持 - 支持 signed、unsigned - 范围:signed 为 -2^15 ~ 2^15-1,unsigned 为 0 ~ 2^16-1 | - 支持 - 只支持 signed - 范围:-32768 ~ 32767 |
| Mediumint | - 支持 - 支持 signed、unsigned - 范围:signed 为 -2^23 ~ 2^23-1,unsigned 为 0 ~ 2^24-1 | 不支持 |
| Int | - 支持 - 支持 signed、unsigned - 范围:signed 为 -2^31 ~ 2^31-1,unsigned 为 0 ~ 2^32-1 | - 支持 - 只支持 signed - 范围:-2147483648 ~ 2147483647 |
| Bigint | - 支持 - 支持 signed、unsigned - 范围:signed 为 -2^63 ~ 2^63-1,unsigned 为 0 ~ 2^64-1 | - 支持 - 只支持 signed - 范围:-2^63 ~ 2^63-1 |
| Largeint | 不支持 | - 支持 - 只支持 signed - 范围:-2^127 ~ 2^127-1 |
| Decimal | - 支持 - 支持 signed、unsigned(8.0.17 以前支持,该版本以上标记为 deprecated) - 默认值:Decimal(10, 0) | - 支持 - 只支持 signed - 默认值:Decimal(9, 0) |
| Float/Double | - 支持 - 支持 signed、unsigned(8.0.17 以前支持,该版本以上标记为 deprecated) | - 支持 - 只支持 signed |
日期类型
| 类型 | MySQL | Doris |
|---|---|---|
| Date | - 支持 - 范围:['1000-01-01', '9999-12-31'] - 格式:YYYY-MM-DD | - 支持 - 范围:['0000-01-01', '9999-12-31'] - 格式:YYYY-MM-DD |
| DateTime | - 支持 - DATETIME([P]),可选参数 P 表示精度 - 范围:'1000-01-01 00:00:00.000000' ~ '9999-12-31 23:59:59.999999' - 格式:YYYY-MM-DD hh:mm .fraction | - 支持 - DATETIME([P]),可选参数 P 表示精度 - 范围:['0000-01-01 00:00:00[.000000]', '9999-12-31 23:59:59[.999999]'] - 格式:YYYY-MM-DD hh:mm .fraction |
| Timestamp | - 支持 - Timestamp[(p)],可选参数 P 表示精度 - 范围:['1970-01-01 00:00:01.000000' UTC, '2038-01-19 03:14:07.999999' UTC] - 格式:YYYY-MM-DD hh:mm .fraction | - 支持 - TIMESTAMPTZ([P]),可选参数 P 表示精度 - 范围:['0000-01-01 00:00:00[.000000]' UTC, '9999-12-31 23:59:59[.999999]' UTC] - 格式:YYYY-MM-DD hh:mm .fraction +XX.XX |
| Time | - 支持 - Time[(p)] - 范围:['-838:59:59.000000', '838:59:59.000000'] - 格式:hh:mm .fraction | - 支持计算,不支持作为列存储到 OLAP 表中 - Time[(p)] - 范围:['-838:59:59.999999', '838:59:59.999999'] - 格式:hh:mm .fraction |
| Year | - 支持 - 范围:1901 ~ 2155,或 0000 - 格式:yyyy | 不支持 |
字符串类型
| 类型 | MySQL | Doris |
|---|---|---|
| Char | - 支持 - CHAR(M),M 为字符长度,缺省表示长度为 1 - 定长 - 范围:[0, 255],字节大小 | - 支持 - CHAR(M),M 为字节长度 - 可变 - 范围:[1, 255] |
| Varchar | - 支持 - VARCHAR(M),M 为字符长度 - 范围:[0, 65535],字节大小 | - 支持 - VARCHAR(M),M 为字节长度 - 范围:[1, 65533] |
| String | 不支持 | - 支持 - 1048576 字节(1 MB),可调大到 2147483643 字节(2 GB) |
| Binary | - 支持 - 类似于 Char | 不支持 |
| Varbinary | - 支持 - 类似于 Varchar | 不支持 |
| Blob | - 支持 - TinyBlob、Blob、MediumBlob、LongBlob | 不支持 |
| Text | - 支持 - TinyText、Text、MediumText、LongText | 不支持 |
| Enum | - 支持 - 最多支持 65535 个 elements | 不支持 |
| Set | - 支持 - 最多支持 64 个 elements | 不支持 |
JSON 数据类型
| 类型 | MySQL | Doris |
|---|---|---|
| JSON | 支持 | 支持 |
Doris 特有的数据类型
下列类型为 Doris 在 MySQL 之外扩展的分析型数据类型,常用于去重计数、分位数计算与半结构化场景。
-
HyperLogLog
HLL 类型不能作为 Key 列使用。在 Aggregate 模型表中使用时,建表时配合的聚合类型为 HLL_UNION。用户不需要指定长度和默认值,长度根据数据的聚合程度由系统内控制。HLL 列只能通过配套的 HLL_UNION_AGG、HLL_RAW_AGG、HLL_CARDINALITY、HLL_HASH 进行查询或使用。
HLL 是模糊去重,在处理大数据量时性能优于 Count Distinct。HLL 的误差率通常在 1% 左右,有时可能会达到 2%。
-
BITMAP
BITMAP 类型不能作为 Key 列使用。在 Aggregate 表中使用时,还需配合 BITMAP_UNION 聚合定义。用户无需指定长度和默认值,长度会根据数据的聚合程度由系统内部控制。BITMAP 列只能通过配套的 BITMAP_UNION_COUNT、BITMAP_UNION、BITMAP_HASH、BITMAP_HASH64 等函数进行查询或使用。
离线场景下使用 BITMAP 可能会影响导入速度,在数据量大的情况下,其查询速度会慢于 HLL,但优于 Count Distinct。注意:在实时场景下,如果 BITMAP 不使用全局字典,而使用了 BITMAP_HASH(),可能会导致约千分之一的误差。如果此误差不可接受,可以使用 BITMAP_HASH64。
-
QUANTILE_PERCENT(QUANTILE_STATE)
QUANTILE_STATE 类型不能作为 Key 列使用。在 Aggregate 模型表中使用时,建表时配合的聚合类型为 QUANTILE_UNION。用户不需要指定长度和默认值,长度根据数据的聚合程度由系统内控制。QUANTILE_STATE 列只能通过配套的 QUANTILE_PERCENT、QUANTILE_UNION、TO_QUANTILE_STATE 等函数进行查询或使用。
QUANTILE_STATE 是一种计算分位数近似值的类型,在导入时会对相同的 Key、不同 Value 进行预聚合:当 Value 数量不超过 2048 时,会采用明细记录所有数据;当 Value 数量大于 2048 时,采用 TDigest 算法对数据进行聚合(聚类),并保存聚类后的质心点。
-
Array<T>
Array<T> 是由 T 类型元素组成的数组,不能作为 Key 列使用。
-
MAP<K, V>
Map 是由 K、V 类型元素组成的映射表,不能作为 Key 列使用。
-
STRUCT<field_name:field_type, ...>
Struct 由多个 Field 组成的结构体,也可被理解为多个列的集合,不能作为 Key 使用。
一个 Struct 中的 Field 名字和数量固定,且总是为 Nullable,一个 Field 通常由下面部分组成:
- field_name:Field 的标识符,不可重复
- field_type:Field 的类型
-
Agg_State
AGG_STATE 不能作为 Key 列使用,建表时需要同时声明聚合函数的签名。
用户不需要指定长度和默认值,实际存储的数据大小与函数实现有关。
语法差异
Doris 的 SQL 语法整体贴近 MySQL,但建表、索引、视图等场景下有一些独有的扩展或限制,迁移时需要特别关注。
DDL 差异
CREATE TABLE
Doris 建表语法如下:
CREATE TABLE [IF NOT EXISTS] [database.]table
(
column_definition_list
[, index_definition_list]
)
[engine_type]
[keys_type]
[table_comment]
[partition_info]
distribution_desc
[rollup_list]
[properties]
[extra_properties]
各子句与 MySQL 的差异如下:
| 参数 | 与 MySQL 的不同之处 |
|---|---|
| column_definition_list | - 字段列表定义,其基本语法与 MySQL 类似。 - Doris 额外包含一个聚合类型的操作,主要支持的数据模型为 Aggregate Key。 - MySQL 允许在字段列表定义后添加 Index 等约束,如 Primary Key、Unique Key 等;而 Doris 则是通过定义数据模型来实现对这些约束和计算的支持。 |
| index_definition_list | - 索引列表定义,基本语法与 MySQL 类似。 - MySQL 支持位图索引、倒排索引和 N-Gram 索引,另外可以通过属性设置布隆过滤器索引。 - MySQL 支持 B+Tree 索引和 Hash 索引。 |
| engine_type | - 表引擎类型,可选。 - 目前支持的表引擎主要是 OLAP 原生引擎。 - MySQL 支持的存储引擎有 InnoDB、MyISAM 等。 |
| keys_type | - 数据模型,可选。 - 支持的类型包括: 1)DUPLICATE KEY(默认):其后指定的列为排序列; 2)AGGREGATE KEY:其后指定的列为维度列; 3)UNIQUE KEY:其后指定的列为主键列。 - MySQL 没有数据模型的概念。 |
| table_comment | 表注释。 |
| partition_info | 分区算法,可选。 Doris 支持的分区算法包括: - LESS THAN:仅定义分区上界,下界由上一个分区的上界决定。 - FIXED RANGE:定义分区的左闭右开区间。 - MULTI RANGE:批量创建 RANGE 分区,定义分区的左闭右开区间,设定时间单位和步长,时间单位支持年、月、日、周和小时。 MySQL 支持的算法:Hash、Range、List Key,并支持子分区,子分区支持的算法有 Hash 和 Key。 |
| distribution_desc | - 分桶算法,必选,包括: 1)Hash 分桶: DISTRIBUTED BY HASH (k1[, k2 ...]) [BUCKETS num|auto],使用指定的 key 列进行哈希分桶;2)Random 分桶: DISTRIBUTED BY RANDOM [BUCKETS num|auto],使用随机数进行分桶。- MySQL 没有分桶算法。 |
| rollup_list | - 建表的同时可以创建多个同步物化视图。 - 语法: rollup_name (col1[, col2, ...]) [DUPLICATE KEY(col1[, col2, ...])][PROPERTIES("key" = "value")]。- MySQL 不支持。 |
| properties | 表属性,与 MySQL 的表属性不一致,定义表属性的语法也与 MySQL 不一致。 |
CREATE INDEX
CREATE INDEX [IF NOT EXISTS] index_name ON table_name (column [, ...],) [USING BITMAP];
- Doris 目前支持:位图索引、倒排索引、N-Gram 索引,以及布隆过滤器索引(通过单独的语法设置)。
- MySQL 支持的索引算法有:B+Tree、Hash。
CREATE VIEW
CREATE VIEW [IF NOT EXISTS]
[db_name.]view_name
(column1[ COMMENT "col comment"][, column2, ...])
AS query_stmt
CREATE MATERIALIZED VIEW [IF NOT EXISTS] mvName=multipartIdentifier
(LEFT_PAREN cols=simpleColumnDefs RIGHT_PAREN)? buildMode?
(REFRESH refreshMethod? refreshTrigger?)?
(KEY keys=identifierList)?
(COMMENT STRING_LITERAL)?
(PARTITION BY LEFT_PAREN partitionKey = identifier RIGHT_PAREN)?
(DISTRIBUTED BY (HASH hashKeys=identifierList | RANDOM) (BUCKETS (INTEGER_VALUE | AUTO))?)?
propertyClause?
AS query
- 基本语法与 MySQL 一致。
- Doris 除了支持逻辑视图外,还支持两种物化视图:同步物化视图和异步物化视图。
- MySQL 不支持物化视图。
ALTER TABLE / ALTER INDEX
Doris ALTER 的语法与 MySQL 基本一致。
DROP TABLE / DROP INDEX
Doris DROP 的语法与 MySQL 基本一致。
DML 差异
INSERT
INSERT INTO table_name
[ PARTITION (p1, ...) ]
[ WITH LABEL label]
[ (column [, ...]) ]
[ [ hint [, ...] ] ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
Doris INSERT 语法与 MySQL 基本一致。
UPDATE
UPDATE target_table [table_alias]
SET assignment_list
WHERE condition
assignment_list:
assignment [, assignment] ...
assignment:
col_name = value
value:
{expr | DEFAULT}
Doris UPDATE 语法与 MySQL 基本一致,但需要注意的是必须加上 WHERE 条件。
DELETE
DELETE FROM table_name [table_alias]
[PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
WHERE column_name op { value | value_list } [ AND column_name op { value | value_list } ...];
上述语法在 Doris 中只能指定过滤谓词。
DELETE FROM table_name [table_alias]
[PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
[USING additional_tables]
WHERE condition
上述语法在 Doris 中只能在 Unique Key 模型表上使用。
Doris DELETE 语法与 MySQL 基本一致。但由于 Doris 是一个分析型数据库,删除操作不能过于频繁。
SELECT
SELECT
[hint_statement, ...]
[ALL | DISTINCT]
select_expr [, select_expr ...]
[EXCEPT ( col_name1 [, col_name2, col_name3, ...] )]
[FROM table_references
[PARTITION partition_list]
[TABLET tabletid_list]
[TABLESAMPLE sample_value [ROWS | PERCENT]
[REPEATABLE pos_seek]]
[WHERE where_condition]
[GROUP BY [GROUPING SETS | ROLLUP | CUBE] {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC], ...]
[LIMIT {[offset_count,] row_count | row_count OFFSET offset_count}]
[INTO OUTFILE 'file_name']
Doris SELECT 语法与 MySQL 基本一致。
SQL 函数
Doris 函数基本覆盖了绝大部分 MySQL 函数,常用的字符串、日期、聚合、窗口函数均可直接使用。
SQL Mode
Doris 支持设置部分 SQL Mode,控制 SQL 解析与执行行为,便于与 MySQL 习惯保持一致。
| 名称 | 设置后的行为 | 未设置时的行为 | 备注 |
|---|---|---|---|
| PIPES_AS_CONCAT | 将 || 符号解析为 concat 函数 | 将 || 符号解析为逻辑或操作符 | - |
| NO_BACKSLASH_ESCAPES | 将字符串中的反斜杠当做正常字符解析 | 将字符串中的反斜杠当做转义起始字符 | - |
| ONLY_FULL_GROUP_BY | 只允许标准的聚合 | 允许聚合结果输出中包含不在聚合 KEY 中的标量值 | 自 3.1.0 版本开始支持 |