跳到主要内容

MySQL 兼容性说明

Doris 高度兼容 MySQL 协议与标准 SQL 语法,业务系统、BI 工具与运维脚本通常无需大幅改动即可接入。但 Doris 作为面向分析的 MPP 数据库,在数据类型、建表语法、数据模型、DML 行为等方面与 MySQL 仍存在差异。

本文从迁移与日常使用两个视角出发,整理 Doris 与 MySQL 的主要差异点,帮助你快速定位写法或行为上的不兼容之处。

适用读者与场景

  • 计划将 MySQL 应用或数仓迁移到 Doris,需要快速评估 SQL 兼容范围。
  • 在 Doris 上沿用 MySQL 习惯写 SQL 时遇到语法或行为差异。
  • 需要核对某个数据类型、DDL/DML 语句在 Doris 中的支持情况。

数据类型差异

下面按数字、日期、字符串、JSON 与 Doris 特有类型分组,列出与 MySQL 的差异。

数字类型

类型MySQLDoris
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

日期类型

类型MySQLDoris
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
不支持

字符串类型

类型MySQLDoris
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 数据类型

类型MySQLDoris
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 列使用,建表时需要同时声明聚合函数的签名。

    用户不需要指定长度和默认值,实际存储的数据大小与函数实现有关。

    AGG_STATE 只能配合 STATE / MERGE / UNION 函数组合器使用。

语法差异

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 版本开始支持