Oracle向mysql进行数据迁移

  • Post author:
  • Post category:mysql




Oracle向mysql进行数据迁移



1、 需要进行的类型替换

序号 Oracle(o) Mysql(m)
1 VARCHAR2、NVARCHAR2 VARCHAR
2 DATE DATETIME
3 TIMESTAMP DATETIME
4 NUMBER DECIMAL
5 INTEGER DECIMAL(22,0)
6 CLOB TEXT
7 BLOB LONGBLOB
8 LONG RAW LONGTEXT
9 LONG LONGTEXT



2、常用语法与函数对照

序号 Oracle(o) Mysql(m) 备注
1 NAME IS NULL NAME=’’ 空字符判断
2 Select 1 from dual Select 1 (m)from不是必须
3 Like Like (o)大小写敏感
4 Sysdate() Now() 获取系统日期
5 TO_CHAR() date_format() 时间转换为字符串
6 TO_DATE() str_to_date() 字符转换为时间
7 ROWNUM < n Limit n-1 取前n-1行
8 aIIbIIc Concat(a,b,c) 字符串拼接
9 SELECT id,name, SUM(a),SUM(b) FROM EMP; SELECT id,name, SUM(a),SUM(b) FROM EMP; (o) 不能正常执行,select后面的列必须是分组的列或者是用了聚合函数的列 (m) 随便分组都可以
10 row_number() over (partition by xx order by xx) rank() over (partition by xx order by xx) dense_rank() over (partition by xx order by xx) count(1) over() 不支持 (m)8.0及以上支持
11 Rtrim(x,y) Rtrim(x) (m)只有一个参数
12 Date1 – Date2 Datediff(d1,d2) (o)日期类型可直接相减;(m)需使用函数
13 Nvl(x,y) Ifnull(x,y)
14 To_number() Cast(x as 类型) 字符串转换数字



3、语法报错与修改

(m) ERROR 1221 (HY000): Incorrect usage of UNION and ORDER BY

(m) ERROR 1221 (HY000): Incorrect usage of UNION and limit

解决:把union all连接的两张表用括号包裹

如:

select xxx limit 1 union all select xxx limit 2


改为:

(select xxx limit 1 ) union all ( select xxx limit 2)

(m) Error : Every derived table must have its own alias

解决:每一个派生出来的表都必须有一个自己的别名

如:

select name form (select * from user)


改为:

select name form (select * from user) a

(m) Error : 1093 – You can’t specify target table ‘a’ for update in FROM clause

解决:不能先select出同一表中的某些值,再update这个表(在同一语句中)

如:

update testable t set t.age = (select age from testable where id = 1)


改为:

update testable t set t.age = (select age from(select age from testable where id = 1) a)

(m) Incorrect datetime value: ‘’ for function str_to_date

解决:从表中select数据时用到str_to_date(date,format)并不报错; 从表中select数据时用到str_to_date(date,format)并将数据insert到另一张表中报错

如:

str_to_date(date,format)


改为:

str_to_date (if(date=’’, null , date), format)

(m) 无rownum

实现,如:
select a.name,a.age ,@rownum:=@rownum+1 as rownum from  (select * from user order by age) a ,(select @rownum:=0) t

(m) 字段内容及列名大小写不敏感的解决方案

解决:创建表时,将字段标记为binary,二进制大小写是敏感的 或 只要在创建表的时候指定collate为utf8_bin,就可以实现大小写敏感,如果建表时未指定,则可修改字段的校对规则,也可以实现大小写敏感。

如:

create table test(id int binary);




create table test(id int) character set utf8 collate utf8_bin;




alter table test modify id collate utf8_bin;



版权声明:本文为qq_43296009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。