GaussDB(DWS)实践系列-MySQL->GaussDB(DWS)常用语法对照表
【摘要】 在项目交付中,经常遇到不同数据库间的数据迁移,本文针对MySQL->GaussDB(DWS)的常用语法兼容性进行了梳理,汇总整理语法对照表,可以参考使用。
GaussDB(DWS)实践系列-MySQL->GaussDB(DWS)常用语法对照表
在项目交付中,经常遇到不同数据库间的数据迁移,本文针对MySQL->GaussDB(DWS)的常用语法兼容性进行了梳理,汇总整理语法对照表,可以参考使用。
序号 | 分类 | MySQL语法 | GaussDB(DWS)适配语法 | 说明 |
1 | 日期类型 | datetime/datetime(0) | timestamp without time zone | datetime是没有时区的时间戳,而timestamp是带时区的时间戳,因此,在转换成DWS中的数据类型时,datetime需要转为timestamp without time zone,timestamp转为timestamp with time zone; 改写样例: Create Table order_info (order_date datetime);替换为 Create Table order_info (order_date TIMESTAMP WITHOUT TIME ZONE); |
2 | timestamp | timestamp with time zone | ||
3 | 数值类型 | tinyint | smallint | DWS与ADB中均存在tinyint这种数据类型,但是,在ADB中其范围是 -128~127,而DWS中为0~255,两者的数据范围是不一致的。 |
4 | int(11)/bigint(20)/tinyint(4) | int/bigint/tinyint | DWS中去掉长度约束 | |
5 | AUTO_INCREMENT | AUTO_INCREMENT自增列修改为serial类型,bigint对应bigserial,int对应serial,SMALLINT 对应SMALLSERIAL | AUTO_INCREMENT对应BIGSERIAL/SERIAL/SMALLSERIAL 改写样例: Create Table market_info('windowId' bigint(20) NOT NULL AUTO_INCREMENT); 替换为 Create Table market_info(windowId bigserial NOT NULL); |
|
6 | double | double precision | double类型对应float类型; 改写样例: Create Table order_info ( live_id varchar(50), tag_price double ); 替换为 Create Table order_info ( live_id varchar(50), tag_price double precision ) ; |
|
7 | float(10, 6) | float(16) | ||
8 | 字符类型 | string类型 | text类型 | 改写样例: Create Table di_corp_replay_prd_indic_d ( live_id varchar(50) , tag_price string ); 替换为 Create Table di_corp_replay_prd_indic_d ( live_id varchar(50) , tag_price text , ) ; |
9 | longtext | text | DWS使用text代替longtext,Mysql longtext 0-4Gb,DWS text最大为1G-8023B(即1073733621B) | |
10 | 列注释 | 列注释是在创建表语法的每一列之后,例如create table order_info('id' bigint comment '主键'); | 列注释语句需要单独使用comment语句添加,例如create table order_info(id bigint); comment on column order_info.id is '主键'; |
改写样例: create table order_info('id' bigint comment '主键'); 替换为 create table order_info(id bigint); comment on column order_info.id is '主键'; |
11 | 表注释 | 建表语句中可以加入表注释,例如Create Table 'order_detail' ( 'corpid' varchar(50) ) COMMENT='商家订单异常明细'; |
表注释需要单独写在表结构之外,例如Create Table order_detail ( corpid varchar(50) ) DISTRIBUTE BY HASH(corpid); comment on table order_detail is '商家订单异常明细'; |
改写样例: Create Table 'order_detail' ( 'corpid' varchar(50) ) COMMENT='商家订单异常明细'; 替换为 Create Table order_detail ( corpid varchar(50) ) DISTRIBUTE BY HASH(corpid); comment on table order_detail is '商家订单异常明细'; |
12 | 分页 | select * from test limit 1,3; | select * from test limit 3 offset 1; | 分页语法用 limit+offset 改写替换 |
13 | 日期函数 | date_format() | to_char() | 改写样例: select date_format(now(), '%Y/%m/%d %H:%i:%s'); 替换为 select to_char(now(),'YYYY-MM-DD HH24:MI:SS'); |
14 | datediff() | EXTRACT() | 改写样例: select datediff(date '2003-05-03',date '2003-05-02'); 替换为 SELECT EXTRACT(EPOCH FROM (date '2003-05-03'- date '2003-05-02'))/60/60/24; |
|
15 | date_sub() | 替换为sysdate - interval | 改写样例: select date_sub(now(),interval 1 hour); 替换为 select sysdate - interval '1 hour'; |
|
16 | date_add() | 替换为sysdate + interval | 改写样例: Select date_add(now(),interval 1 hour); 替换为 select sysdate + interval '1 hour'; |
|
17 | TIMESTAMPDIFF() | EXTRACT() | 改写样例: select TIMESTAMPDIFF(second,'2017-07-06 20:00:30','2017-07-06 20:01:00') ; 替换为 SELECT EXTRACT(EPOCH FROM (timestamp '2017-07-06 20:01:00'- timestamp '2017-07-06 20:00:30')); |
|
18 | UNIX_TIMESTAMP() | EXTRACT() | 改写样例: select UNIX_TIMESTAMP(substr(adddate(NOW() , INTERVAL -1 MONTH),1,10)) * 1000; 替换为 SELECT EXTRACT(EPOCH FROM substr(now() - INTERVAL '1 MONTH',1,10))*1000; |
|
19 | MINUTE() | date_part() | 改写样例: SELECT MINUTE("2017-06-20 09:34:00"); 替换为 SELECT date_part('minute', timestamp '2017-06-20 09:34:00'); |
|
20 | now() | sysdate | 改写样例: select now(); 替换为 select sysdate; |
|
21 | str_to_date() | to_date() | 改写样例: select str_to_date('20201127193000','%Y%m%d%H%i%s'); Oracle兼容模式替换为: select to_date('2020-11-27 19:30:00','YYYY-MM-DD HH24:MI:SS'); TD兼容模式替换为: select to_timestamp('2020-11-27 19:30:00','YYYY-MM-DD HH24:MI:SS'); |
|
22 | current_timestamp() | sysdate | 改写样例: select current_timestamp(); 替换为 select sysdate; |
|
23 | adddate() | 替换为sysdate - interval | 改写样例: select adddate(NOW() , INTERVAL -1 MONTH); 替换为 select sysdate - interval '1 month'; |
|
24 | 截取时分秒 | date_format() | substr() | 改写样例: select date_format(date_add(now(), interval - 5 minute),'%H:%i:%S'); 替换为 select substr(sysdate - interval '5 minute',11,14); |
25 | 超长表名 | MySQL允许表名超过64位 | DWS表名长度不允许超过64位,超过部分被截断; | DWS表名长度不允许超过64位,超过部分被截断; |
26 | BROADCAST表 | BROADCAST表 | 复制表 | 改写样例: Create Table di_corp_replay_prd_indic_d ( live_id varchar(50) , tag_price double , )DISTRIBUTE BY BROADCAST ; 替换为 Create Table di_corp_replay_prd_indic_d ( live_id varchar(50) , tag_price double , )distribute by REPLICATION; |
27 | 语法替换 | if(1=2,'true','false'); | 替换为case when | 改写样例: select if(1=2,'true','false'); 替换为 select case when 1=2 then 'true' else 'false' end; |
28 | UUID() | sys_guid() | 改写样例: select UUID(); 替换为 select sys_guid(); |
|
29 | ifnull() | nvl() | 改写样例: select ifnull(null,'true'); select ifnull(1,'true'); 替换为 select nvl(null,'true'); select nvl('1','true'); |
|
30 | Group_concat() | string_agg() | 改写样例: select id,group_concat(name) from aa group by id; 替换为 select id,string_agg(name,',') from aa group by id; |
|
31 | distinct id,name | distinct(id,name) | 改写样例: select distinct id,name from aa; 替换为 select distinct(id,name) from aa; |
|
32 | clustered key | 不支持,去掉 | 改写样例: Create Table copy_di_distributor_buyer_contribution_ranking_v2 ( shop_id varchar , distributor_id varchar , buyer_id varchar , date_type bigint , dw_insert_time varchar , clustered key clustered_key(shop_id ASC,distributor_id ASC,date_type ASC,order_amount_rank ASC), primary key (shop_id,distributor_id,date_type,buyer_id) ) DISTRIBUTE BY HASH(shop_id,distributor_id,date_type); 替换为 Create Table copy_di_distributor_buyer_contribution_ranking_v2 ( shop_id varchar , distributor_id varchar , buyer_id varchar , date_type bigint , dw_insert_time varchar , primary key (shop_id,distributor_id,date_type,buyer_id) ) DISTRIBUTE BY HASH(shop_id,distributor_id,date_type); |
|
33 | REPLACE 实时覆盖 | merge into | 改写样例: REPLACE INTO edw_akapp_order_info SELECT * FROM outer_edw_akapp_order_info; 替换为 merge into edw_akapp_order_info a using outer_edw_akapp_order_info b on a.p_order_id = b.p_order_id and a.cartproductid = b.cartproductid; |
|
34 | 单引号转义 | ' | \' | 改写样例: and live_name in("【超值】英格莱恩/Ingram's美妆0404", "【美配29】科颜氏 Kiehl's美妆1229", "【必播】爱呵护I'vebaby纸尿裤&拉拉裤0730", "【森马集团】THE CHILDREN'S PLACE童装0718") 替换为 and live_name in ('【超值】英格莱恩/Ingram\'s美妆0404','【美配29】科颜氏 Kiehl\'s美妆1229','【必播】爱呵护I\'vebaby纸尿裤&拉拉裤0730','【森马集团】THE CHILDREN\'S PLACE童装0718') |
35 | 字段命名 | 字段名支持以数字开头 | dws字段名不能以数字开头,需加双引号 | 改写样例: CREATE TABLE IF NOT EXISTS order_info( school TEXT, grade TEXT, class TEXT, 20_50w BIGINT, datetime float ) DISTRIBUTE BY HASH(school); 替换为 CREATE TABLE IF NOT EXISTS order_info( school TEXT, grade TEXT, class TEXT, "20_50w" BIGINT, datetime float ) DISTRIBUTE BY HASH(school); |
36 | 语法规范 | ‘! =’中间可以有空格 | ‘! =’中间不能有空格 | 改写样例: and order_source ! = 'all' 替换为 and order_source != 'all' |
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)