云数据库 SelectDB 版采用 MySQL 网络连接协议,并兼容大部分 MySQL 语法。但作为面向分析场景的列式存储数据库,SelectDB 在数据类型、DDL、DML 等方面与 MySQL 仍存在差异。本文逐项说明这些差异,便于您从 MySQL 迁移或对照排查问题。
数据类型
数值类型
类型 | MySQL | SelectDB |
Boolean |
|
|
Bit |
| 不支持。请使用 BOOLEAN 或 TINYINT 表达。 |
Tinyint |
|
|
Smallint |
|
|
Mediumint |
| 不支持。请改用 INT。 |
Int |
|
|
Bigint |
|
|
Largeint | 不支持。 |
|
Decimal |
|
|
Float / Double | 8.0.17 之前 signed 和 unsigned 均可使用,之后 unsigned 已标记为 deprecated。 | 仅有符号,无 unsigned。 |
日期时间类型
类型 | MySQL | SelectDB |
Date |
|
|
DateTime |
|
|
Timestamp |
| 不支持。请使用 DATETIME 替代。 |
Time |
| 不支持。如果只需保存时分秒,可使用 VARCHAR 或在 DATETIME 列上提取。 |
Year |
| 不支持。请改用 SMALLINT 或 DATE。 |
字符串类型
类型 | MySQL | SelectDB |
Char |
|
|
Varchar |
|
|
String | 无对应类型。 |
|
Binary / Varbinary | CHAR / VARCHAR 的二进制版本。 | 不支持。请改用 STRING。 |
Blob / Text | 提供 TinyBlob、Blob、MediumBlob、LongBlob 及对应 Text 系列。 | 不支持。请改用 STRING。 |
Enum / Set |
| 不支持。请改用 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 |
|
index_definition_list |
|
engine_type |
|
keys_type |
|
table_comment | 表注释,与 MySQL 用法一致。 |
partition_info |
|
distribution_desc |
|
rollup_list |
|
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,常用模式如下:
名称 | 设置后的行为 | 未设置时的行为 | 备注 |
|
|
| - |
| 字符串中的反斜杠按字面字符处理,不再触发转义。 | 字符串中的反斜杠作为转义起始字符。 | - |
| SELECT 中的非聚合列必须出现在 GROUP BY 中,否则报错。 | 允许 SELECT 输出未在 GROUP BY KEY 中的标量列。 | Cloud 4.1.0 起支持(对应 Apache Doris 3.1.0)。 |