一、直接支持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';
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;
修改前:
修改后:
6、like匹配函数
在mysql中,默认的排序方式会让字符串的值不区分大小写,使用 "="或者"like"时,能进行不区分大小写的匹配,需要使用 "binary"关键字才是准确的字符串匹配。注意,要先修改参数 B_COMPATIBILITY_MODE
解决方案:
set B_COMPATIBILITY_MODE= on;
SELECT 'a' like 'A';
SELECT 'a' like binary 'A'
7、建表ENGINE、CHARSET、COLLATE关键字支持
mysql的create table 语法中有ENGINE、CHARSET、COLLATE,GBase 8c在语法上支持
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 关键字, 如下图所示
3、进行显式类型转换
GBase 8c 的right 函数参数值 参与计算后会自动转换成bigint
ERROR: function right(character varying, bigint) does not exist
解决方法:添加显示类型转换
修改前:
修改后:
4、设置字段别名与GBase 8c关键字重复
解决方法:在关键字上添加双引号
修改前:
修改后:
5、多个查询结果集进行union时报错
解决方法:修改所有表的排序字符集一致