MySQL兼容性

更新时间:
复制为 MD 格式

云数据库 SelectDB 版采用 MySQL 网络连接协议,并兼容大部分 MySQL 语法。但作为面向分析场景的列式存储数据库,SelectDB 在数据类型、DDL、DML 等方面与 MySQL 仍存在差异。本文逐项说明这些差异,便于您从 MySQL 迁移或对照排查问题。

数据类型

数值类型

类型

MySQL

SelectDB

Boolean

  • 支持。

  • 取值:0 表示 false,1 表示 true。

  • 支持,关键字 BOOLEAN

  • 取值:0 表示 false,1 表示 true。

Bit

  • 支持。

  • 位宽 1~64。

不支持。请使用 BOOLEAN 或 TINYINT 表达。

Tinyint

  • 支持有符号和无符号两种。

  • signed 范围:-128~127。

  • unsigned 范围:0~255。

  • 仅有符号,无 unsigned。

  • 范围:-128~127。

Smallint

  • 支持有符号和无符号两种。

  • signed 范围:-2^15~2^15-1。

  • unsigned 范围:0~2^16-1。

  • 仅有符号,无 unsigned。

  • 范围:-32768~32767。

Mediumint

  • 支持有符号和无符号两种。

  • signed 范围:-2^23~2^23-1。

  • unsigned 范围:0~2^24-1。

不支持。请改用 INT。

Int

  • 支持有符号和无符号两种。

  • signed 范围:-2^31~2^31-1。

  • unsigned 范围:0~2^32-1。

  • 仅有符号,无 unsigned。

  • 范围:-2147483648~2147483647。

Bigint

  • 支持有符号和无符号两种。

  • signed 范围:-2^63~2^63-1。

  • unsigned 范围:0~2^64-1。

  • 仅有符号,无 unsigned。

  • 范围:-2^63~2^63-1。

Largeint

不支持。

  • SelectDB 扩展类型,仅有符号。

  • 范围:-2^127~2^127-1。

Decimal

  • 8.0.17 之前 signed 和 unsigned 均可使用,之后 unsigned 已标记为 deprecated。

  • 未指定参数时默认 DECIMAL(10, 0)。

  • 仅有符号,无 unsigned。

  • 未指定参数时默认 DECIMAL(38, 9)。

Float / Double

8.0.17 之前 signed 和 unsigned 均可使用,之后 unsigned 已标记为 deprecated。

仅有符号,无 unsigned。

日期时间类型

类型

MySQL

SelectDB

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:ss[.fraction]。

  • 声明:DATETIME([P]),P 为可选小数秒精度(0~6)。

  • 范围:0000-01-01 00:00:00[.000000] ~ 9999-12-31 23:59:59[.999999]。

  • 格式:YYYY-MM-DD hh:mm:ss[.fraction]。

Timestamp

  • 声明:TIMESTAMP[(P)]。

  • 范围:1970-01-01 00:00:01.000000 UTC ~ 2038-01-19 03:14:07.999999 UTC。

不支持。请使用 DATETIME 替代。

Time

  • 声明:TIME[(P)]。

  • 范围:-838:59:59.000000 ~ 838:59:59.000000。

  • 格式:hh:mm:ss[.fraction]。

不支持。如果只需保存时分秒,可使用 VARCHAR 或在 DATETIME 列上提取。

Year

  • 范围:1901~2155 或 0000。

  • 格式:YYYY。

不支持。请改用 SMALLINT 或 DATE。

字符串类型

类型

MySQL

SelectDB

Char

  • CHAR(M),M 表示字符个数,默认 1。

  • 定长,写入时不足 M 会补足空格。

  • 字节范围:[0, 255]。

  • CHAR(M),M 表示字节数。

  • 变长,写入时按实际长度存储,不补空格。

  • 字节范围:[1, 255]。

Varchar

  • VARCHAR(M),M 表示字符个数。

  • 字节范围:[0, 65535]。

  • VARCHAR(M),M 表示字节数。

  • 字节范围:[1, 65533]。

String

无对应类型。

  • SelectDB 扩展类型,存储大文本。

  • 默认 1 MB(1048576 字节),可调至约 2 GB(2147483643 字节)。

Binary / Varbinary

CHAR / VARCHAR 的二进制版本。

不支持。请改用 STRING。

Blob / Text

提供 TinyBlob、Blob、MediumBlob、LongBlob 及对应 Text 系列。

不支持。请改用 STRING。

Enum / Set

  • Enum 最多 65535 个枚举项。

  • Set 最多 64 个枚举项。

不支持。请改用 VARCHAR 或 STRING 自行约束。

JSON 数据类型

MySQL 与 SelectDB 均提供 JSON 类型,可直接存储 JSON 文档并配合 JSON 函数访问字段。

SelectDB 特有的数据类型

下列类型为 SelectDB 提供、MySQL 不具备,主要服务于分析型工作负载:

  • HLL(HyperLogLog):模糊去重类型,误差通常约 1%(最高约 2%),适合海量数据基数估算。不可作为 Key 列;需配合 HLL_UNION 聚合及 HLL_UNION_AGG、HLL_CARDINALITY 等函数使用。

  • BITMAP:精确去重类型,性能优于 COUNT(DISTINCT)。不可作为 Key 列;需配合 BITMAP_UNION 聚合及 BITMAP_UNION_COUNT、BITMAP_HASH 等函数使用。

  • QUANTILE_STATE:分位数近似类型,Value 数量超过 2048 时切换为 TDigest 聚合。不可作为 Key 列;需配合 QUANTILE_UNION 聚合及 QUANTILE_PERCENT、TO_QUANTILE_STATE 等函数使用。

  • ARRAY<T>:相同元素类型 T 的有序集合,不可作为 Key 列。

  • MAP<K, V>:K、V 类型组成的键值对集合,不可作为 Key 列。

  • STRUCT<field_name:field_type, ...>:具名字段组成的结构体,字段名与数量固定且每个字段都为 Nullable,不可作为 Key 列。

  • VARIANT:可自动推断 Schema 的半结构化类型,按列式存储,适合字段动态变化的日志和用户画像场景。

  • AGG_STATE:聚合中间状态类型,建表时需声明聚合函数签名,存储大小由实现决定。不可作为 Key 列;只能与 STATE / MERGE / UNION 函数组合器配合使用。

DDL 语法差异

CREATE TABLE

SelectDB 建表语句的整体骨架如下:

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 的主要不同点:

子句

差异

column_definition_list

  • 字段定义本身与 MySQL 接近。

  • SelectDB 在字段后可声明聚合类型(用于 Aggregate Key 模型)。

  • MySQL 通过 PRIMARY KEY、UNIQUE KEY 等约束在字段列表后声明,SelectDB 改为通过数据模型(keys_type)表达。

index_definition_list

  • SelectDB 在字段后可声明位图、倒排或 N-Gram 索引;布隆过滤器索引通过 PROPERTIES 单独配置。

  • MySQL 提供 B+Tree 与 Hash 索引,SelectDB 不支持。

engine_type

  • 可选。SelectDB 默认使用 OLAP 原生引擎。

  • 无 InnoDB / MyISAM 等存储引擎可选。

keys_type

  • 可选。SelectDB 概念,决定数据存储与读写行为。

  • DUPLICATE KEY(默认):声明的列作为排序列。

  • AGGREGATE KEY:声明的列作为维度列。

  • UNIQUE KEY:声明的列作为主键列。

  • MySQL 没有数据模型概念。

table_comment

表注释,与 MySQL 用法一致。

partition_info

  • 可选。SelectDB 提供以下三种 RANGE 分区写法:

  • LESS THAN:仅声明分区上界,下界由上一个分区上界推断。

  • FIXED RANGE:直接声明左闭右开区间。

  • MULTI RANGE:按时间单位(年/月/日/周/小时)和步长批量创建 RANGE 分区。

  • MySQL 提供 Hash、Range、List Key 算法以及子分区,SelectDB 不支持子分区。

distribution_desc

  • 必选,MySQL 无对应概念。

  • Hash 分桶:DISTRIBUTED BY HASH(k1[,k2 ...]) [BUCKETS num|auto]

  • Random 分桶:DISTRIBUTED BY RANDOM [BUCKETS num|auto]

rollup_list

  • 可选,SelectDB 扩展。

  • 允许在建表的同时声明多个同步物化视图。

  • 语法:rollup_name (col1[, col2, ...]) [DUPLICATE KEY(col1[, ...])][PROPERTIES("key"="value")]

properties

表属性键名和取值与 MySQL 完全不同,主要用于设置副本数、存储策略等 SelectDB 自身属性。

完整示例:

CREATE TABLE demo.user_behavior (
    user_id BIGINT,
    item_id BIGINT,
    behavior VARCHAR(20),
    ts DATETIME
)
DUPLICATE KEY(user_id, item_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES ("replication_allocation" = "tag.location.default: 1");

CREATE INDEX

CREATE INDEX [IF NOT EXISTS] index_name ON table_name (column [, ...]) [USING BITMAP];

SelectDB 提供位图、倒排和 N-Gram 三种 CREATE INDEX 索引;布隆过滤器索引通过表 PROPERTIES 单独设置。MySQL 的 B+Tree 与 Hash 索引在 SelectDB 中不再需要,因为底层列存格式已自带相应过滤能力。

CREATE VIEW

逻辑视图与 MySQL 用法一致。SelectDB 还提供同步物化视图和异步物化视图两种物化视图能力,MySQL 不具备。

-- 逻辑视图
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name
  (column1[ COMMENT "col comment"][, column2, ...])
AS query_stmt;

-- 异步物化视图
CREATE MATERIALIZED VIEW [IF NOT EXISTS] mv_name
  (col_defs)
  [BUILD (IMMEDIATE | DEFERRED)]
  [REFRESH [refresh_method] [refresh_trigger]]
  [KEY (keys)]
  [COMMENT "comment"]
  [PARTITION BY (partition_key)]
  [DISTRIBUTED BY {HASH(keys) | RANDOM} [BUCKETS num|AUTO]]
  [PROPERTIES (...)]
AS query;

ALTER / DROP TABLE 与 INDEX

ALTER TABLE / ALTER INDEX 与 DROP TABLE / DROP INDEX 的语法和 MySQL 接近,可以直接复用既有脚本。需要留意:SelectDB 的列变更属于 Schema Change,会异步执行;建议通过 SHOW ALTER TABLE COLUMN 跟踪进度后再发起后续依赖该列的写入或查询。

DML 语法差异

INSERT

INSERT 与 MySQL 兼容,并新增 PARTITION 指定写入分区、WITH LABEL 标识导入任务、Hint 控制执行计划等子句:

INSERT INTO table_name
    [PARTITION (p1, ...)]
    [WITH LABEL label]
    [(column [, ...])]
    [[hint [, ...]]]
    {VALUES ({expression | DEFAULT} [, ...]) [, ...] | query};

UPDATE

UPDATE 整体形态与 MySQL 一致,但有两点限制:

  • 必须显式声明 WHERE 条件,否则语法报错。

  • 仅 Unique Key 模型的表支持 UPDATE,其他模型应通过 INSERT OVERWRITE 或重新导入实现。

UPDATE target_table [table_alias]
    SET assignment_list
    WHERE condition;

DELETE

DELETE 与 MySQL 接近,提供两种语法形式以匹配不同模型:

-- 形式一:仅过滤谓词,适用于所有数据模型
DELETE FROM table_name [table_alias]
    [PARTITION partition_name | PARTITIONS (partition_name [, ...])]
    WHERE column_name op {value | value_list} [AND column_name op {value | value_list} ...];

-- 形式二:支持复杂条件与多表关联(USING 子句),仅适用于 Unique Key 模型
DELETE FROM table_name [table_alias]
    [PARTITION partition_name | PARTITIONS (partition_name [, ...])]
    [USING additional_tables]
    WHERE condition;
说明

SelectDB 是分析型数据库,不擅长高频次的单行删除。建议通过分区滚动、INSERT OVERWRITE 等批量手段维护数据。

SELECT

SELECT 与 MySQL 兼容,并新增 Hint、EXCEPT 列排除、PARTITION/TABLET 指定、TABLESAMPLE 采样、GROUPING SETS / ROLLUP / CUBE 多维聚合、INTO OUTFILE 等扩展:

SELECT
    [hint_statement, ...]
    [ALL | DISTINCT]
    select_expr [, select_expr ...]
    [EXCEPT (col_name1 [, col_name2, ...])]
    [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'];

SQL 函数

SelectDB 函数在覆盖 MySQL 主流函数的基础上,额外提供面向分析的扩展函数(BITMAP、HLL、ARRAY、MAP 等)。完整函数清单可参考 Apache Doris SQL 函数文档

SQL Mode

SelectDB 通过 SET sql_mode = 'MODE_NAME' 设置 SQL Mode,常用模式如下:

名称

设置后的行为

未设置时的行为

备注

PIPES_AS_CONCAT

|| 解析为 CONCAT 字符串拼接函数。

|| 解析为逻辑或运算符。

-

NO_BACKSLASH_ESCAPES

字符串中的反斜杠按字面字符处理,不再触发转义。

字符串中的反斜杠作为转义起始字符。

-

ONLY_FULL_GROUP_BY

SELECT 中的非聚合列必须出现在 GROUP BY 中,否则报错。

允许 SELECT 输出未在 GROUP BY KEY 中的标量列。

Cloud 4.1.0 起支持(对应 Apache Doris 3.1.0)。