前几天因工作需要我得将Oracle数据库中几十张表转移到Mysql中,由于之前没有相关经验,上网简单百度后选用Navcat Premium软件工作。
Navcat Premium进行数据转移有三种办法:1、复制表 2、导出、导入数据 3、导出成sql脚本,执行。
一开始使用复制表的方法,打开菜单栏“工具”的数据传输功能,左边选择要复制的表,右边选择连接然后选中目标数据库,接下在就是next by next的一键式操作。这个方法真的很方便,但是bug也很多,最大的bug是数值类型不匹配。Oracle中数值类型是Number2,复制到Mysql中默认为double型,而我需要的是int型。使用这方法失败。
接着尝试将Oracle表中数据导出为文件再导入Mysql,由于导入导出操作有些复杂,且无法批量操作,需要在Mysql中先创建表,然后逐一导入数据,所以放弃。
最后尝试将数据以及表结构转储为sql脚本文件,在Mysql中执行。打开菜单栏“工具”的数据传输功能,左边选择要复制的表,右边选择文件。Mysql中执行sql文件时遇到问题,Oracle转储生成的sql脚本文件中数值类型是decimal(xx,xx),日期类型是datetime(x),而Mysql中没有decimal数值类型,日期类型只支持datetime并无显式的大小限定,于是决定用sublime编辑器修改。使用sublime查找功能find all找出所有datetime(xx,xx),统一改为int,执行后发现有错误。原来有的字段类型是decimal(xx,xx)而有的字段类型是decimal(x,x),deciaml(xx,x)……,统一修改时会误删其它字符。于是想到正则表达式匹配,刚好sublime支持正则查找,使用正则查找功能匹配所有decimal(xx,xx),decimal(xx,x),decimal(x,xx)……统一改为int类型,然后用同样的方法修改datetime类型,再执行sql脚本,这下终于成功执行,数据也都是正确的,大功告成!
最后说说这个方法的局限:如果有这样一个需求,Mysql中部分字段数值类型需要是double、部分需要是int,这该如何是好?暂时能想到的是先在Mysql中创建表,再逐一导入数据。