Oracle数据库迁移到MySQL数据库Oracle数据库迁移到MySQL数据库
1 字段类型差异
Oracle MySQL解决⽅案varchar2varchar varchar date date/time/datetime/timestamp datetime clob tinytext/text/mediumtext/longtext longtext blob tinyblob/blob/mediumblob/longblob longblob
number tinyint/smallint/mediumint/int/bigint decimal/float/double
Oracle number的取值范围为1-38位
NUMBER(1-2)–TINYINT,
NUMBER(3-4)–SMALLINT ,
NUMBER(5-6)–MEDIUMINT,
NUMBER(7-9)–INT,
NUMBER(10-19)–BIGINT,
NUMBER(20+)或NUMBER(int,int)–DECIMAL
若ORM框架⽤的Hibernate,建议使⽤decimal代替number
2 函数差异(附部分案例)
差异项Oracle MySQL案例连接分页ROWNUM limit或⾃定义变量
空值转换NVL(s1,r1):若s1为null,返回r1,否则返回s1;
SELECT NVL(NULL, ‘R’) FROM DUAL;
SELECT NVL(‘S’, ‘R’) FROM DUAL;
Oracle也⽀持coalesce函数
ifnull(s1,r1)、coalesce(s1,r1)
SELECT coalesce(NULL, ‘R’);
SELECT coalesce(‘S’, ‘R’);clipboard是哪个数据库
空值转换2NVL2(s1,r1,r2):若s1为null,返回r2,否则返回
r1;
SELECT NVL2(NULL, ‘R1’, ‘R2’) FROM
DUAL;
SELECT NVL2(‘S’, ‘R1’, ‘R2’) FROM
DUAL;
可以⽤case when代替
select case when null is null then ‘R2’
else ‘R1’ end;
select case when ‘S’ is null then ‘R2’
else ‘R1’ end;
截取TRUNC()可以⽤于数值、⽇期对于截取⽇期可以⽤date_format+str_to_date
实现;
对于数字截取可⽤truncate()
序列序列.NEXTVAL⽆序列
系统⽇快速选择排序算法
期
SYSDATE sysdate()、NOW()
添加⽉份ADD_MONTHS(date, int)
SELECT add_months(to_date(‘2021-05-
19’,‘yyyy-MM-dd’), 1) FROM dual;
date_add(date, INTERVAL int month)
select date_add(str_to_date(‘2021-05-
19’,’%Y-%m-%d’), interval 1 month);
两⽇期
间隔的
⽉份
MONTHS_BETWEEN(date1,date2)(date1-date2的天数)/31,保留9位⼩数
类型转换TO_DATE()
SELECT TO_DATE(‘2021-05-19
17:15:33’,‘yyyy-MM-dd hh24:mi:ss’) FROM
DUAL;
str_to_date()
select str_to_date(‘2021-05-19
17:15:33’,’%Y-%m-%d %H:%i:%s’);
date_format(date)
SELECT CONVERT(‘test’,
linux操作系统的三个主要部分及其功能TO_CHAR(date) TO_CHAR(number)
date_format(date)
cast(number as char)
convert(number,char)
CHAR CHARACTER SET utf8);
SELECT CAST(‘test’ AS
CHAR CHARACTER SET utf8);
字符串截取SUBSTR(str,int,int) 第⼆个参数可正负0
SUBSTR(str,int,int) 第⼆个参数可正负,若为0
则返回空字符串
INSTR INSTR(str,subStr,pos)三个参数,可指定开始位
置,pos=0返回0,pos<0,从尾⾯开始查
instr(str,subStr)两个参数
locate(subStr,str,pos):pos<=0时返回0
字符串
连接
||、CONCAT(s1,s2),concat只能有两个参数concat(s1,s2,s3,…)可有多个参数
字符串替换replace(str, substr)
replace(str,substr,repstr)
仅⽀持replace(str,substr,repstr)
⾏转列WM_CONCAT、LISTAGG group_concat
条件选
择
DECODE case when
正则REGEXP_LIKE(expr,pat)expr REGEXP pat
差异项Oracle MySQL案例连接
3 其他差异
差异项Oracle MySQL
全局临时表⽀持不⽀持表分区⽀持⽀持,但有主键是分区字段必须是主键字段FULL
JOIN
⽀持不⽀持,left join + right join
DELETE 可以没有from关键字
可以⽤exists
必须有from
不可以⽤exists
mysql语句转oracle正则表达式REGEXP_SUBSTR()REGEXP
集合相减Minus⽆,可⽤not in
NULL 和’’
ORACLE认为’‘等同于NULL
LENGTH(’’)为NULL TO_DATE(’’,‘YYYYMMDD’)为空
TO_NUMBER(’’,1)为NULL
oracle中’’,数值类型的插⼊,NULL oracle中’’,字符类
型,NULL oracle中’’,时间类型,NULL
python多线程加速for循环NULL和’‘不同 LENGTH(’’)为0
TO_DATE(’’,‘YYYYMMDD’),报错
TO_NUMBER(’’,1),报错
MySQL中’’ 数值类型的插⼊,报错 MySQL中’’ 字符类
型,’’ MySQL中’’ 时间类型,报错
合并MERGE INTO⽆此语法,⽤存储过程
group by
havingmybatisplus源码
oracle having语句可以在group by之前MySQL having语句必须在group by之后去重unique、distinct distinct
不等于Oracle中 ! =,< >操作符中间允许有空格MySQL中不可以,且字符类型与数字类型不可⽐较别名派⽣表(即⼦查询形成的视图)有⽆别名皆可 ,别名可重复MySQL派⽣表必须有别名 ,别名不可重复,DELETE不能有别名其它⽀持中⽂空格,中⽂逗号不⽀持
数字+and/or 之间可以⽆空格不⽀持
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论