迁移前数据库:MySQL8.0,迁移后数据库:磐维数据库 中间件:Shardingsphere-JDBC 5.4 | ||||||
系统功能 | 问题原因 | 改造方式 | 备注 | |||
加密/解密 | MySQL数据库加密/解密: 加密: HEX(AES_ENCRYPT(BL_PHONES, '8NONwyJtHesysWpM')) 解密: AES_DECRYPT(UNHEX(BL_PHONES),'8NONwyJtHesysWpM') as BL_PHONES | |||||
加解密字段不能为空串或者null | panweiDB加密/解密: 加密: 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 version | VERSION()函数 不可以作为字段 | |||||
修改字段属性不一样 | ALTER TABLE cm_system_resource_files CHANGE VERSION VER int; | ALTER TABLE cm_system_resource_files RENAME COLUMN VERSION TO VER int; | ||||
FIND_IN_SET | CONCAT(',', 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_OWN | NVL(c.OP_OWN, '') as OP_OWN | |||||
group_concat | LISTAGG(role_name, ',') WITHIN GROUP (ORDER BY role_name) AS role_names\STRING_AGG(r.name,',') | |||||
nextseqval mysql查询序列 | nextval (可能不存在) | |||||
order by | 在进行排序的时候需要对排序字段进行查询 | |||||
SUBSTRING_INDEX | SUBSTR(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 |
国产化-磐维数据库与mysql的部分语法区别整理
最新推荐文章于 2025-01-26 17:07:34 发布