一、直接支持mysql的用法

1、变量定义

mysql_b=# alter database mysql_b set enable_set_variable_b_format = on;
ALTER DATABASE
mysql_b=#set @var_name := 123;
SET
mysql_b=#select @var_name;
@var_name
-----------
      123
(1 row)

2、DEFINER定义属主

mysql_b=# create definer=bus_user view test_definer as select * from atest limit 5;
CREATE VIEW

3、AUTO_INCREMENT自增列

mysql_b=# create table test_AUTO_INCREMENT
mysql_b-# (id int AUTO_INCREMENT,
mysql_b(# val varchar(10),
mysql_b(# PRIMARY KEY (id)
mysql_b(# );
NOTICE:  CREATE TABLE will create implicit sequence "test_auto_increment_id_seq" for serial column "test_auto_increment.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_auto_increment_pkey" for table "test_auto_increment"
CREATE TABLE
mysql_b=# insert into test_AUTO_INCREMENT(val) values ('a');
INSERT 0 1
mysql_b=# insert into test_AUTO_INCREMENT(val) values ('b');
INSERT 0 1
mysql_b=# select * from test_AUTO_INCREMENT;
id | val
----+-----
 1 | a
 2 | b
(2 rows)

4、多列进行Group by分组

报错:ERROR:  column "su.user_type" must appear in the GROUP BY clause or be used in an aggregate function

解决方法:show dolphin.sql_mode;
执行这个命令关掉 sql_mode_full_group
alter database database_test3  set dolphin.sql_mode = 'sql_mode_strict,pipes_as_concat,ansi_quotes,no_zero_date,pad_char_to_full_length,auto_recompile_function,error_for_division_by_zero';

GBase 8c对MySQL语法的兼容性说明及改造_8c

5、隐式类型转换 

GBase 8c在字段类型不兼容的情况下,默认进行隐式转换后会报 WARNING:  invalid input syntax for type

select '2020-05-22' - interval '22 day'; 报错信息如下:

 
解决方法:alter database database_test1_new set dolphin.b_compatibility_mode =on;

修改前:

GBase 8c对MySQL语法的兼容性说明及改造_mysql_02

修改后:

GBase 8c对MySQL语法的兼容性说明及改造_mysql_03

6、like匹配函数 

在mysql中,默认的排序方式会让字符串的值不区分大小写,使用 "="或者"like"时,能进行不区分大小写的匹配,需要使用 "binary"关键字才是准确的字符串匹配。注意,要先修改参数 B_COMPATIBILITY_MODE

解决方案:

set B_COMPATIBILITY_MODE= on;
SELECT 'a' like 'A';
SELECT 'a' like binary 'A'

GBase 8c对MySQL语法的兼容性说明及改造_8c_04

7、建表ENGINE、CHARSET、COLLATE关键字支持 

mysql的create table 语法中有ENGINE、CHARSET、COLLATE,GBase 8c在语法上支持

GBase 8c对MySQL语法的兼容性说明及改造_mysql_05

8、dolphin.sql_mode介绍 

默认值:’sql_mode_strict,sql_mode_full_group,pipes_as_concat,ansi_quotes,no_zero_date,pad_char_to_full_length’

参数说明:参数值为逗号间隔的字符串,仅允许合法字符串设定,不合法情况下,启动后报warning。同样,设置时候,如果新值非法,则报warning并且不修改老值。当前有几种场景会用到sql_mode:

  • sql_mode_strict:

插入不符合当前列类型的值时,进行数据转换;分两种场景,insert into table values(…) 和insert into table select … 主要涉及到各种数据类型之间的互相转换,目前涉及的类型有tinyint[unsigned],smallint[unsigned],int[unsigned],bigint[unsigned],float,double,numeric,clob,char和varchar;

插入的列值长度超过此列所限定的长度时,赋予该列最大或最小值,涉及的类型有tinyint[unsigned],smallint[unsigned],int[unsigned],bigint[unsigned],float,double,numeric,clob,char和varchar;

insert时,属性是非空且没有默认值的列,且没有在insert的列表中,则为其添加默认值;(涉及的类型同上)

支持对属性是非空且没有默认值的列显式插入default;(涉及的类型同上)

  • sql_mode_full_group:

出现在select列表中的列(不使用聚合函数),是否一定要出现在group by子句中。当处在sql_mode_full_group模式(默认模式)下,如果select列表中的列没有使用聚合函数,也没有出现在group by子句,那么会报错,如果不在此模式下,则会执行成功,并在所有符合条件的元组中选取第一个元组。
出现在order by中的列,是否一定要出现在distinct中(注意是distinct,不是distinct on)。当处在sql_mode_full_group模式(默认模式)下,不允许没有出现在distinct中的列出现在order by子句中,否则允许。

  • pipes_as_concat:

+

控制 || 当成连接符还是 或操作符

  • ansi_quotes:

主要是针对出现在各种需要使用双引号表示字符串值的地方。当ansi_quotes打开,就表示此时的双引号中的内容要作为对象引用看待;当ansi_quotes关闭时,表示双引号中的内容要作为字符串的值看待。当关闭ansi_quotes时,会导致部分元命令失效

  • no_zero_date:

控制 ‘0000-00-00’  是否为合法日期,支持DATE、DATETIME类型

no_zero_date, sql_mode_strict    非法日期,报错(使用update/insert ignore时告警)

no_zero_date    非法日期,告警

sql_mode_strict    合法日期,无告警

–                          合法日期,无告警

  • pad_char_to_full_length:

控制char类型查询时是否删除尾部空格。

二、间接支持mysql的用法

1、Interval函数带表达式

GBase 8c不支持函数中带有表达式,如 select (curdate() - interval (weekday(curdate()) + 7) day)

解决方法:将 interval 中的函数提取出来, 以上语句转换成(解决思路,先将表达式式中的结果计算出来,然后通过与 interval '1 day'相乘转换单位)
SELECT (CURRENT_DATE - (weekday(curdate()) + 7) * INTERVAL '1 day');

2、排序规则无法确定

报错: ERROR:  could not determine which collation to use for view column "check_name"
HINT:  Use the COLLATE clause to set the collation explicitly.

解决方法

在图中标绿色的字段后面 添加 COLLATE utf8mb4_general_ci  关键字, 如下图所示

GBase 8c对MySQL语法的兼容性说明及改造_mysql_06

3、进行显式类型转换 

GBase 8c 的right 函数参数值 参与计算后会自动转换成bigint
ERROR:  function right(character varying, bigint) does not exist

解决方法:添加显示类型转换

修改前:

GBase 8c对MySQL语法的兼容性说明及改造_mysql_07

修改后:

GBase 8c对MySQL语法的兼容性说明及改造_mysql_08

4、设置字段别名与GBase 8c关键字重复 

解决方法:在关键字上添加双引号

修改前:

GBase 8c对MySQL语法的兼容性说明及改造_解决方法_09

修改后:

GBase 8c对MySQL语法的兼容性说明及改造_sql_10

5、多个查询结果集进行union时报错

解决方法:修改所有表的排序字符集一致

GBase 8c对MySQL语法的兼容性说明及改造_8c_11