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

MySQL 兼容性

最近更新时间2024.02.27 10:40:13

首次发布时间2023.11.08 16:10:09

ByteHouse 企业版在 2.4.0 版本开始,增加了对 MySQL 5.7 和 MySQL 8.0 常用功能及语法的兼容,可以实现与 MySQL 客户端应用程序和工具的无缝集成。这将使用户能够使用熟悉的 MySQL 协议与 ByteHouse 企业版进行交互,并利用 MySQL 生态系统的功能。

说明

请在 ByteHouse 2.4 及以上版本使用此功能,并建议您升级到最新版本以获得更好的支持。
升级方法:火山引擎控制台 > 集群管理 > 集群列表 > 集群详情 > 基本信息 > 引擎版本 > 版本变更
图片

协议兼容情况

通过 MySQL Client 命令行连接

  1. 如果您已经安装好 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=XXXXXX

图片

  1. 成功连接ByteHouse集群后,可查询现有数据库,参考语句如下。
show databases;

图片

通过 ClickHouse Client 命令行连接

您可参考 ClickHouse Client 连接到 ByteHouse,并使用 MySQL 语法操作 ByteHouse。
图片

语法兼容情况

支持但需要设置模式

部分 MySQL 函数,与 ClickHouse 模式下的同名函数存在冲突。
因此,在使用时需要设置 dialect_type='MYSQL',举例如下:

select adddate('2022-01-22',interval '3' day) settings dialect_type='MYSQL';

目前需要设置方言才能使用的查询,包括但不限于:

  1. 函数 Function
    1. adddate
    2. date_sub
    3. subdate
    4. concat_ws
    5. format AS
  2. DQL:
    1. union except

与 MySQL 有差异的特性详细说明

  1. locate:ByteHouse 企业版运算逻辑和 MySQL 不同,所以需要设置方言才能够保持一致
  2. cast:在 MySQL 模式下,部分函数返回值与 ClickHouse 模式下不同(主要为类型默认值的差异),部分在 ClickHouse 模式下会报错。如
    1. 返回值不同:
      1. SELECT cast(4.3 AS boolean);
    2. 报错:
      1. SELECT cast('a' AS boolean);
      2. SELECT cast( 'China' AS decimal(5,2));
      3. SELECT cast('China' AS smallint);
      4. SELECT cast('a' AS bigint);
      5. SELECT cast(date '2021-09-18' AS bigint);
      6. SELECT cast( date '2021-09-17' AS double);
      7. SELECT cast(timestamp '2001-1-22' AS time);
  3. avg函数的内置类型默认值不同,结果为空时,ClickHouse 模式下 返回nan,MySQL返回NULL
  4. min、max:ByteHouse 数值类型默认值为0,MySQL上为NULL,这样会导致两者上min,max结果不同

暂无计划支持的问题

  1. log函数不支持使用两个参数的用法。
    1. MySQL支持;
    2. ByteHouse 可使用log_with_base作为替代;
  2. rand函数的结果范围。
    1. MySQL返回的是范围是0~1;
    2. ByteHouse 上用randCanonical()来返回[0,1)随机数;
  3. round函数的差异。
    1. ByteHouse 返回结果末尾是0会省略,如SELECT round(345.983,1);在ByteHouse 返回346,abd和MySQL返回346.0;
  4. curdate函数不加小括号语法报错。
    1. MySQL支持;
    2. 使用select curdate时报错,ByteHouse 需要加括号select curdate();
  5. date_format函数不同。
    1. 目前ByteHouse 中dateformat已经被占用所以可用date_format_mysql代替date_format;
  6. 部分非标准用法的参数不支持,如:
    1. 非yyyy-mm-dd标准用法:select datediff('2022-01-22 23:59:59','2022-1-21') settings dialect_type='MYSQL';
    2. 非hh-mm-ss标准用法:select subtime('2022-10-31 23:59:59','0:1:1');
  7. dayofweek函数的返回值不同。
    1. ClickHouse dialect下和ClickHouse一致,MySQL dialect下和MySQL、adb返回值相同;
  8. localtime返回值格式不同。
    1. MySQL返回年月日+时间,ByteHouse 只返回时间且ClickHouse的时间有三位小数;
    2. ByteHouse 可使用localtimestamp()替代;
  9. 时间函数在计算时间时,时间范围和MySQL不同。
    1. 目前time只支持00:00:00 - 23:59:59;MySQL会返回一个负值,ByteHouse 不会返回负值;
      1. select maketime(-1,15,30);
      2. select sec_to_time(86401);
      3. select subtime(date '2022-10-31','00:01:01');
      4. select subtime(time '02:12:59','10:13:01');
      5. select timediff(time '12:09:11','13:59:30');
      6. select timediff(time '12:09:10',time '12:56:34');
  10. 缺少一些异常时间值的合法性校验,如
  11. select minute('2022-02-03 10:61:03');
  12. time_format返回值不同
  13. select time_format(date '2022-01-22','%H %k %h %I %l');MySQL的%k是0...23, 我们的是00...23
  14. 默认时区不同,导致部分函数返回值不同
  15. SELECT to_seconds('2022-02-02');
  16. select to_seconds('2022-02-02 09:09:00');
  17. select to_seconds(timestamp '2022-02-02 09:09:00');
  18. select to_seconds(time '09:09:00');
  19. bin函数返回值不同
  20. ClickHouse上会比MySQL上多个前缀,如SELECT bin(12);
  21. 部分函数 MySQL 比 ByteHouse 多了一层hex的转化,如
  22. SELECT char(97,110,97,108,121,116,105,99,100,98);
  23. SELECT unhex(hex('China'));
  24. SELECT from_base64('Q2hpbmE=');
  25. Concat 中的参数校验
  26. 其中Space参数为负值时,MySQL没有强校验,ClickHouse会报错
  27. SELECT concat('#', space(-1), '#');
  28. encrypt函数使用diff
  29. ClickHouse只支持三个参数,MySQL 5.6可以支持两个参数
  30. ClickHouse上暂不支持|,需要使用bitOr(a,b)代替
  31. SELECT make_set(bitOr(1,4),'hello','nice',NULL,'world')AS result;
  32. unnest函数不支持

其他注意事项

  1. 使用低于 2.4 版本的 ClickHouse client时,部分MySQL function会报错语法不识别,如select adddate();
  2. 生态兼容问题:通过 Workbench、Navicat 等程序连接 ByteHouse 时可能产生不兼容情况,目前主要存在Unknow function:current_userDatabase doesn't exists:information_schema两种报错,计划会在未来的版本中修复。