国产化-磐维数据库与mysql的部分语法区别整理

迁移前数据库:MySQL8.0,迁移后数据库:磐维数据库
中间件:Shardingsphere-JDBC 5.4
系统功能问题原因改造方式备注
加密/解密MySQL数据库加密/解密:
加密:
HEX(AES_ENCRYPT(BL_PHONES, '8NONwyJtHesysWpM'))

解密:
AES_DECRYPT(UNHEX(BL_PHONES),'8NONwyJtHesysWpM') as BL_PHONES
加解密字段不能为空串或者nullpanweiDB加密/解密:
加密:
gs_encrypt(bl_phones,'秘钥','sm4')

解密:
gs_decrypt(bl_phones ,'秘钥','sm4'),
u.`name`u.name
SELEC Tinet_server_addr();可以查询到当前数据库的ip
时间函数 now() 写在Dao层不生效(后续可以)替换为syadate
UNHEX(name)函数不生效在程序中加解密(暂时)
getNextNum() 函数不生效
date_format 函数不生效(此函数是MySQL特有的函数)
例如date_format(o.update_time,'%Y-%m-%d %H:%i:%s')
使用 TO_CHAR 函数
例如TO_CHAR(update_time, 'YYYY-MM-DD HH24:MI:SS')
MySQL 中,查询 count 时,SQL后面加上 order by xxx desc没问题磐维不支持在查询 count 时,后面带上 order by,需要删除
MySQL 中,cast(phone as CHAR),是将字段拆解为一个个字符重新拼起来
即原数据不变,只是结果类型变了(猜测)
磐维中,cast 函数不是拆解成每个字符,而是取该数据的第一个字母/数字
并且遇到中文会报错,如 cast('233' as CHAR) 结果为 2
cast('移动移不动' as CHAR) 结果报错
c.VERSION versionVERSION()函数 不可以作为字段
修改字段属性不一样ALTER TABLE cm_system_resource_files CHANGE VERSION VER int;ALTER TABLE cm_system_resource_files RENAME COLUMN VERSION TO VER int;
FIND_IN_SETCONCAT(',', your_column, ',')
别名别名需要" ",不然全小写,在"中需要转义"
group by分组时,使用GROUP BY子句时,SELECT子句中的非聚合列必须包含在GROUP BY子句中需要自连接或者等值连接转换
select
max(d.ID) maxId,d.file_name
from
cm_system_resource_files d
select * from cm_system_resource_files c where id in(select
max(d.ID) maxId
from
cm_system_resource_files d)
需要自连接或者等值连接转换
CONCAT( if(FIND_IN_SET('1', c.transcoding_method), '接口方式 ', ''), if(FIND_IN_SET('2', c.transcoding_method), '转码工具 ', ''), if(FIND_IN_SET('3', c.transcoding_method), '自动转码 ', '') )) transcodingMethod,CASE
WHEN c.transcoding_method IS NULL OR c.transcoding_method = '0' THEN '无'
WHEN CONCAT(',', c.transcoding_method, ',') LIKE '%,1,%' THEN '接口方式'
WHEN CONCAT(',', c.transcoding_method, ',') LIKE '%,2,%' THEN '转码工具'
WHEN CONCAT(',', c.transcoding_method, ',') LIKE '%,3,%' THEN '自动转码'
ELSE ''
INNER JOIN cm_page_region_op_config o ON FIND_IN_SET( t.tp_id, o.c_tp_id )
AND
t.chan_id = o.chan_id
INNER JOIN cm_page_region_op_config o ON INSTR(CONCAT(',', o.c_tp_id, ','), CONCAT(',', t.tp_id, ',')) > 0
AND t.chan_id = o.chan_id
FIND_IN_SET('3', c.transcoding_method)
IFNULL(c.OP_OWN, '') as OP_OWNNVL(c.OP_OWN, '') as OP_OWN
group_concatLISTAGG(role_name, ',') WITHIN GROUP (ORDER BY role_name) AS role_names\STRING_AGG(r.name,',')
nextseqval mysql查询序列nextval (可能不存在)
order by在进行排序的时候需要对排序字段进行查询
SUBSTRING_INDEXSUBSTR(r.tp_desc, 1, INSTR(r.tp_desc, ':') - 1) AS tp_name,
Long nextNo = this.sequenceUtil.getNextSeqVal("cm_ad_request_info");可能需要重写getNextSeqVal方法
LOCATE('子串', 整串) 函数返回子字符串在整串第一次出现的位置,没有返回0替换为 INSTR(整串, '子串')
有时会使用 <= DATE_FORMAT(?,'%Y-%m-%d') 其中 ? 位置传入
想要比较的日期,例如 '1999-01-01'
在磐维可以使用 TO_CHAR(DATE '1999-01-01', YYYY-MM-DD) 来格式化,但是,
如果是 TO_CHAR(DATE ?, YYYY-MM-DD) 使用 ? 传入 '1999-01-01',会报错,其将 DATE 和 '1999-01-01'
看作整体导致 TO_CHAE 函数报错,应使用 TO_CHAR(TO_DATE( ? , 'YYYY-MM-DD'), 'YYYY-MM-DD')
同时也要注意,建议传入 ? 的参数为 YYYYMMDD 或 YYYY-MM-DD 形式

解决办法2:<= DATE_FORMAT(?,'%Y-%m-%d') 直接改成 <= ? ,传入 '%Y-%m-%d' 格式的数据即可
DATE_FORMAT(c.up_time, '%Y-%m-%d %H:%i:%s') >= DATE_FORMAT(?, '%Y-%m-%d %H:%i:%s')AND TO_CHAR(c.up_time, 'YYYY-MM-DD HH24:MI:SS') >= TO_CHAR(?, 'YYYY-MM-DD HH24:MI:SS')
find_in_set(?,AES_DECRYPT(UNHEX(c.BL_PHONES),?))sql.append("LOCATE(CONCAT(',', ?, ','), gs_decrypt(c.BL_PHONES,'" + DbConstant.AES_KEY + "','sm4')) > 0");
select if ( a is null , b, c) as d 如果 a 为 null 为真,返回 b,否则返回 c更换为 COALESCE(a, b) 在 a 不为空返回 a,否则返回 b,可能不满足要求,可以换成
case when a is null then b else c end as d
REGEXP_LIKE
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值