🖥️Oracle 12c 转 Mysql8 问题汇总
00 分钟
2024-2-20
2024-3-28
type
status
date
slug
summary
tags
category
icon
password

前言

对应的版本内容如下
工具
对应版本
Oracle
12c
Mysql
8.0.33
ORM框架
mybatis 3.4.2
转换工具
Navicat

函数错误

concat函数使用有区别

代码示例

导致问题

查出的数据为空

区别及分析

区别
Oracle
Mysql
拼接内容
只能拼接两个字符串CONCAT(str1,str2)
能拼接多个CONCAT(str1,str2,…)
参数为空结果
有空值也没事(下图1)
只要有一个为空,结果就是空(下图2)
notion image
notion image

解决方法

在mysql中,增加ifnull(参数,'')的函数,保证如果参数为空,则返回空字符串即可

时间相减

代码示例

导致问题

数据计算出错

区别与分析

区别
Oracle
Mysql
时间相减
计算出是以天为单位的数字
计算出的结果很怪异
oracle Date减出来的是以天为单位
notion image
mysql datetime减出来的,很奇怪。
notion image

解决方法

需要增加time_to_sec,求出的是秒数。如果要转日或者天,则除以60和24即可。
notion image

or 不走索引

代码示例

导致问题

不走索引会出现查询缓慢

区别与分析

oracle

oracle的or语法走不走索引,这个还不一定,最好自己在写完sql后,自己查询一下执行计划,看看扫描行数。使用plsql的功能可以查询,我使用的是datagrip,选择要查询的sql,右键会出现explain plan的按钮,点击便可以查看。
notion image
点击之后结果如下所示,可以看出,扫描最多的行数为3360,明显不是全表扫描(这几个表,每个表都至少5W+的数据量)
notion image

mysql

mysql使用explain即可,可以查询扫描结果。
结果如下图所示,可以看出,第二条数据,扫描了40W行数据,进行了一次全表扫描
notion image

解决办法

将or转换成union all,每个链接子查询都走索引,速度就很快了
如图所示可以看出,每个执行的sql,扫描行数的极少
notion image
在修改完之后,总体sql(以上查询的sql,只为总sql的一小部分)查询时间从27秒减小到526毫秒。优化效果显著。
notion image

其他错误

DATE_FORMAT使用错误

转换的时候,直接将时间转换的to_char替换成DATE_FORMAT。导致mysql的时间DATE_FORMAT两次,出现了空值。
notion image

转换时,oracle类型Number类型对应到mysql为decimal

在oracle中,经常会用Number作为数字类型的存储,Number默认值,可以认为Number(38,0),最后存储的是一个整数,而转换到mysql上,就会变成decimal(65,32),导致查询的时候出现一堆小数点的问题。
notion image