You need to enable JavaScript to run this app.
导航

MySQL 兼容性

最近更新时间2023.11.16 10:58:27

首次发布时间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表的更新和删除)

连接并使用 MySQL

通过 MySQL Client 命令行连接

如果您已经安装好 mysql client,您可以通过以下语法连接到 ByteHouse。

--访问命令  其中默认端口为9004
mysql --protocol tcp -h [hostname] -u [username] -P [port_number] --password=[password]

--访问命令示例
mysql --protocol tcp -h 7277767706697666852-public.bytehouse-ce.volces.com -u bytehouse_test -P 9004 --password=P@55word

图片
成功连接 ByteHouse 集群后,可查询现有数据库,参考语句如下。

show databases;

图片

通过 ByteHouse CLI 命令行连接

您可参考 ByteHouse CLI 快速入门连接到 ByteHouse,并使用 MySQL 语法操作 ByteHouse。
图片

兼容情况

数据类型

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

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

其中与 MySQL的差异包括:

  1. DECIMAL 最大精度为76;;Current implementation of decimal in CNCH limits it to have max precision to be 76
  2. Data Date16 covers 1970 - 2149,Date32 covers the range from 1900-2299;
  3. TIME. CNCH supports 3-9 digits of scales;
  4. TIMESTAMP.Uses number types and convert to date time internally

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

  • Array
  • Map
  • Json

函数 Function

暂不支持

暂不支持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()作用在空表上,cnch返回nan,mysql返回NULL

min(),
max()

cnch的默认值和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)的随机数,cnch上是返回UInt32整个范围的随机数

用randCanonical()来返回[0,1)的随机数

encrypt()

mysql里是2个参数即可,ck里需要3个参数,第一个参数指定加密算法

encrypt('aes-128-ecb','abdABC123','1234567890123456');

data_format()

cnch中已有客户需求需要用data_format来做hive的format

cnch中用data_format_mysql来来提