You need to enable JavaScript to run this app.
导航
概述
最近更新时间:2024.07.25 14:31:19首次发布时间:2023.11.16 10:58:27

本节主要介绍 ByteHouse 云数仓版的 MySQL 模式与原生 MySQL 数据库的兼容性对比信息。
ByteHouse 云数仓版在 2.0 版本开始,增加了对 MySQL 5.7 和 MySQL 8.0 常用功能及语法的兼容,可以实现与 MySQL 客户端应用程序和工具的无缝集成。这将使用户能够使用熟悉的 MySQL 协议与 ByteHouse 进行交互,并利用 MySQL 生态系统的功能。
由于产品架构不同,或者客户需求不大,有些功能并没有被支持。本节主要从以下几方面介绍 ByteHouse 数据库的 MySQL 模式与原生 MySQL 数据库的不同:

  • 数据类型
  • 函数
    • 部分function的部分用法不支持
    • 部分function的结果和MySQL不一致
  • 支持MySQL的DQL
  • 支持MySQL的DML(当前仅支持unique表的更新和删除)

兼容情况

数据类型

ByteHouse 数据库支持的数据类型有:

  • 数值类型
    • 整数类型:BOOL/BOOLEAN/TINYINTSMALLINTMEDIUMINTINT/INTEGERBIGINT
    • 定点类型:DECIMAL * 和 NUMERIC
    • 浮点类型:FLOATDOUBLE
    • Bit-Value 类型:BIT
  • 日期时间类型:DATETIMETIMESTAMPDATETIME * 和 YEAR
  • 字符类型:CHARVARCHARBINARYVARBINARY
  • 大对象类型:TINYBLOBBLOBMEDIUMBLOBLONGBLOB
  • 文本类型:TINYTEXTTEXTMEDIUMTEXTLONGTEXT
  • 集合类型:SET

其中与 MySQL的差异包括:

  1. DECIMAL 最大精度为76;
  2. Data Date16涵盖1970 - 2149,Date32涵盖1900-2299;
  3. TIME. ByteHouse支持3-9位精度;
  4. TIMESTAMP.使用数字类型并在内部转换为日期时间。

暂时不完全支持的类型包括:

  • Array
  • Map
  • Json

函数

暂不支持

暂不支持MySQL以下函数:

  • convert_tz() : 当前不支持GMT/MET这种时区参数

与MySQL不一致

函数差异

repeat(),
rpad(), sapce()

参数传负数时会报错,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(),
max()

ByteHouse的默认值和MySQL不一致,数值类型默认值是0,MySQL上默认值为NULL,这时候计算min(),max()可能会受到这个影响导致结果不一致。可以在建表时加上Nullable()来规避此问题。

localtime()

结果比MySQL上少了年月日

str_to_date()

格式化参数和传入时间没有对齐的话,返回值有区别
str_to_date('2022-01-06 10:20:30','%Y-%m-%d'),ByteHouse 返回 NULL,MySQL返回 2022-01-06

需要设置方言类型为MYSQL

通过设置 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
  • format()
  • locate()
  • adddate()
  • date_sub()
  • datediff()
  • dayofweek() :MySQL 里默认周日为第1天,ByteHouse 里默认周一为第1天。
  • concat_ws()

用法与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中,现有客户要求使用data_format来模仿Hive的格式

在ByteHouse中,使用data_format_mysql代替data_format

其他

  • ByteHouse暂时不兼容MySQL关联子查询。例如,以下类型的关联子查询在 ByteHouse 执行时会报错。
SELECT (SELECT id FROM db.table1 WHERE id = t1.id) FROM db.table1 AS t1;