本节主要介绍 ByteHouse 云数仓版的 MySQL 模式与原生 MySQL 数据库的兼容性对比信息。
ByteHouse 云数仓版在 2.0 版本开始,增加了对 MySQL 5.7 和 MySQL 8.0 常用功能及语法的兼容,可以实现与 MySQL 客户端应用程序和工具的无缝集成。这将使用户能够使用熟悉的 MySQL 协议与 ByteHouse 进行交互,并利用 MySQL 生态系统的功能。
由于产品架构不同,或者客户需求不大,有些功能并没有被支持。本节主要从以下几方面介绍 ByteHouse 数据库的 MySQL 模式与原生 MySQL 数据库的不同:
ByteHouse 数据库支持的数据类型有:
BOOL
/BOOLEAN
/TINYINT
、SMALLINT
、MEDIUMINT
、INT
/INTEGER
和 BIGINT
。DECIMAL
* 和 NUMERIC
。FLOAT
和 DOUBLE
。BIT
。DATETIME
、TIMESTAMP
、DATE
、TIME
* 和 YEAR
。CHAR
、VARCHAR
、BINARY
和 VARBINARY
。TINYBLOB
、BLOB
、MEDIUMBLOB
和 LONGBLOB
。TINYTEXT
、TEXT
、MEDIUMTEXT
和 LONGTEXT
。SET
。其中与 MySQL的差异包括:
DECIMAL
最大精度为76;Data
Date16涵盖1970 - 2149,Date32涵盖1900-2299;TIME
. ByteHouse支持3-9位精度;TIMESTAMP
.使用数字类型并在内部转换为日期时间。暂时不完全支持的类型包括:
Array
Map
Json
暂不支持MySQL以下函数:
函数差异 | |
---|---|
repeat(), | 参数传负数时会报错,MySQL上返回空或NULL |
exp() | 精度差异 |
ln() | 精度差异 |
bin() | ByteHouse返回结果会比MySQL多了0000的前缀 |
from_base64() | 传入错误的base64值会报错,MySQL上返回NULL |
cast() | 和ADB有差异,部分用法MySQL也不支持,转成boolean类型的结果是true/false,而不是1/0 |
avg() | avg()作用在空表上,ByteHouse返回nan,mysql返回NULL |
min(), | ByteHouse的默认值和MySQL不一致,数值类型默认值是0,MySQL上默认值为NULL,这时候计算min(),max()可能会受到这个影响导致结果不一致。可以在建表时加上Nullable()来规避此问题。 |
localtime() | 结果比MySQL上少了年月日 |
str_to_date() | 格式化参数和传入时间没有对齐的话,返回值有区别 |
通过设置 dialect_type='MYSQL',可以使下面列表中的函数按照 MYSQL 的方法执行。
ENABLE OPTIMIZER=1 SET dialect_type='MYSQL'; or [query] + SETTINGS dialect_type='MYSQL'; DESC TABLE t1 SETTINGS dialect_type='MYSQL'; or $CLICKHOUSE_CLIENT --dialect_type=MYSQL
以下函数的用法与MySQL有差异,使用时需注意:
函数名 | 差异 | 解 法 |
---|---|---|
if | 仅支持3个参数,2个参数需要改写 | |
log() | 不支持两个参数log(10,100) | 新增log_with_base()来支持2个参数的用法 |
rand() | 在 MySQL 上,它返回 [0,1) 范围内的随机数,而在 ByteHouse 上,它返回整个 UInt32 范围内的随机数 | 要在 ByteHouse 中返回 [0,1) 范围内的随机数,请使用 randCanonical |
encrypt() | 在 MySQL 中,两个参数就足够了,但在 ByteHouse 中,需要三个参数。 第一个参数指定加密算法 | encrypt('aes-128-ecb','abdABC123','1234567890123456'); |
data_format() | 在ByteHouse中,现有客户要求使用 | 在ByteHouse中,使用 |
SELECT (SELECT id FROM db.table1 WHERE id = t1.id) FROM db.table1 AS t1;