如何将oracle数据库转换成mysql数据库,现在公司有急用,方法可用的话再加分!讲解Oracle数据库移植到MySQL
出处:IT专家网 日期:2010-06-24
一、前言
公司原来的项目是基于Oracle数据库的,Oracle功能强大 , 但是部署和管理较复杂 , 更重要的是,购买Oracle的费用不是每个客户都愿意承担的 。因此,迫切需要把公司项目所用数据库移植到一个简单好用的数据库上 。当然 , 如您所料,我们选择了广受欢迎的MySQL 。
作为一个开源数据库,MySQL用无数案例证明了她的可用性,因此让我们把重点放在如何将Oracle移植到MySQL上 。已经有很多的文章和专题介绍了Oracle移植到MySQL的方法和步骤,也有相当多的工具可以辅助这种移植过程 。但是,由于数据库实现的差异 , 完美的移植工具是不存在的,移植过程中不断碰到的问题证明了这一点,特别是您使用了Oracle的一些高级特性时 。
从Oracle移植到MySQL主要有六个方面的内容需要移植 , 一是表Table , 包括表结构和数据,二是触发器Trigger,三是存储过程Procedure,函数function和包Package,四是任务Job,五是用户等其他方面的移植,六是具体应用程序通过SQL语句访问时的细节差异克服 。
笔者用来移植测试的数据库是:Oracle 9i ,MySQL 6.0,Windows 2000环境 。
二、表的移植
这个部分的移植是最容易用工具实现的部分,因为很多MySQL的图形管理工具都自带这样的移植工具,比如SQLYog,MySQL Administrator等 。但是 , 这些工具的移植能力各有不同,对字段类型转换、字符集等问题都有自己的处理方式,使用时请注意 。
笔者使用“SQLYog Migration Toolkit”工具按提示步骤移植后,表的主要结构和数据将成功移植,主要包括表的字段类型(经过映射转换,比如number会转换为double,date转换为timestamp等,请小心处理日期字段的默认值等),表的主键,表的索引(Oracle的位图索引会被转成BTree索引 , 另外表和字段的注释会丢失)等信息 。需要特别注意的是,Oracle的自增字段的处理 。
大家知道,Oracle通常使用序列sequence配合触发器实现自增字段,但是MySQL和SQL Server等一样 , 不提供序列 , 而直接提供字段自增属性 。所以,请把Oracle里面的自增字段实现直接改为MySQL的字段属性 , 而且,这个字段必须是主键(key)并且不能有默认值 。
还有一个问题,如果您的应用要直接使用Oracle的某个序列,那么您只能在MySQL里面模拟实现一个,具体方法就是利用MySQL的自增字段实现的 。
三、触发器的移植
首先 , MySQL在6.0以后才支持触发器!
触发器的移植没有现成工具,因为两者之间的语法差异较大,您只能通过手工对照着原来的逻辑一个一个添加 。
这里要说明一下,MySQL的SQL过程语法和Oracle PL/SQL大致相同 , 但还是有些细微差别:
1. 变量声明Declare部分 , 在Oracle中Declare语句位于Begin之前,在MySQl中,Declare位于Begin之后;
2. 注释不同,在Oracle中 , 可用 “—“ 注释一行或“/* */”注释一段 , 在MySQL中,需用 “/* */”或“#”来注释
3. 对触发前后变量值的引用方法不同;在Oracle中 , 用 :new.eid, :old.eid表示新旧值,
在MySQL中,用 New.eid,old.eid表示新旧值
4. 移植中发现的问题
1) Oracle的自治事务autonomous_transaction , MySQL不支持,您必须用其他方式实现 , MySQL不允许在触发器过程中执行对触发器所在表的操作(包括读写)
2) MySQL函数和trigger中不能执行动态SQL语句,也就是说,您不能在触发器里面组合出来一个SQL字符串,然后用exec来执行
3) Oracle的表级触发器 , MySQL还不支持,所以必须改成使用行级触发器,注意这会导致有时SQL语句的执行效率很低
四、存储过程,函数和程序包的移植
程序包是Oracle用来组织逻辑功能的一个Object,MySQL不支持 , 因此需要将包里的存储过程、函数等全部放到该数据库公有过程和函数里面 。
MySQL的过程和函数语法与Oracle类似,但还是有细微差别,除了数据类型需要转换,还有:
1. 格式不同,例如:
Oracle为:
CREATE OR REPLACE procedure procedure1(TableName in varchar2) is
MySQL应该为:
CREATE procedure procedure1( in TableName varchar(200))
2. 赋值语句不同:
Oracle赋值语句为:
strSQL := ‘update table set field1=1’;
MySQL应该为:
Set StrSQL = ‘update table set field1=1’;(用:=也行)
3. 一些要用到游标的过程请注意
【甲骨文怎么转mysql 如何将甲骨文翻译成现在文字】MySQL过程不支持嵌套游标 , 不支持带参游标,不支持记录类型%ROWTYPE,不支持数组等 , 原Oracle用到这些的必须改写
五、Job的移植
Job是Oracle的定时任务实现的方法,MySQL6中用Event实现,具体语法请参考MySQL手册 。
在MySQL中使用event请注意,默认它是不运行的,您可以
1) 保证MySQL定时任务event scheduler运行,需要MySql 5.1.6以上,并且在启动后执行SET GLOBAL event_scheduler = ON;(也可以在初始配置文件比如my.ini中加入event_scheduler = ON的参数)
2) 启用event功能后 , 每次执行会往MySQL的错误日志文件写一些信息(data目录下的“主机名.err”文件),导致这个文件越来越大(除非经常做flush log操作) 。所以,如果您的event执行很频繁 , 可在my.ini中加参数console=TRUE,这样执行event的信息就不会写进来了
六、用户的移植
Oracle的用户管理和MySQL下有较大区别,请分别建立用户,并赋予合适的权限 。
七、应用程序的移植
由于语法细节上的差异,导致很多SQL语句需要改写 。笔者记下了所有移植过程中碰到的SQL语句细节差异,这些也是一般项目可能会用到的地方,虽然肯定不全,但也列出来以供参考:
1)Oracle的to_char函数不能再使用,换用如CONCAT(14.3)的形式,为了提高应用程序兼容性 , 建议手工写一个
2)Oracle的to_date函数不能再使用,建议手工写一个添加到MySQL数据库
3)Oracle的decode函数不能再使用,换用SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END 的形式
4)nvl这样的一些专用函数,MySQL是没有的,可以把
select nvl(to_char(num),'nothing') from t_equipment转换成
select case num when num then num else 'nothing' end from t_equipment
5)instr之类的函数,函数名相同,但参数个数不同
6)Oracle的sysdate要写成sysdate()的形式
7)包的形式已经取消,所以原来以包的方式调用的过程如xx_pack.xxx要写成xxx()
8)带进制字符转数字
Oracle风格:TO_NUMBER(strTmp,'XX') TO_NUMBER(’9’)
MySQL风格:CONV(strTmp,16,10) CONV(’9’,10,10) 如果字符串前后有加减操作,会隐含转换成数字
9) 不能再有直接调用序列的形式,如果一定需要,可以模拟实现一个
10)日期直接加减的含义不同了,比如Oracle中sysdate1 变成了sysdate()interval 1 day(注意如果写成sysdate()1 语法还是正确的,但含义是错误的)
查询select sysdate()1 from dual 在MySQL得到比如 20080223153234(= 200802231532331)的数
而在Oracle中会得到第二天当前时刻 。
11) MySQL单纯的date类型只是日期不带时间,DATETIME或TIMESTAMP带有时间,用DATE_FORMAT函数可以控制显示形式
12)select 'abc' || 'd' from dual 两个数据执行的结果不同(语法都能通过),MySQL要写成select concat('abc' , 'd')的形式
13) Oracle高级功能,如带有暗示索引的select语句 , MySQL是不支持的(语法可以通过)
14)有些MySQL的保留字不能直接用在SQL语句里,要加表名或别名限制,如select RIGHT FROM XX要改成select a.RIGHT FROM XX a
15) Oracle的子查询可以不起别名,但MySQL是必须的 , 比如下面的别名aa:
select field1 from (select sysdate() as field1 from dual) as aa
16)很多系统表名都是不同的,比如,列出某个表的信息:
select * from tab where TName='T_TEST'改成
select table_name,table_type from information_schema.tables where table_schema = 'user' and table_name=' T_TEST '
17)MySQL下update时不能有本身的子查询
update T_TEST set Flag = 0 where field1 in
(select distinct b.field1 from T_TEST b where b.flag=1)
18)Oracle下’’和null等价,而MySQL则不然
select 1 from dual where '' is null在Oracle下可以取到记录,在MySQL下不能
dual表的使用 , substr、trim等函数的主要使用方式和Oracle类似
八、小结和建议
看起来,Oracle移植到MySQL似乎挺麻烦,有没有一键完成的简单办法?呵呵,我没有找到,除非您只使用基本表,只使用基本SQL语句访问它 。当然,建议大家初始设计的时侯,就考虑到多数据库的支持 , 权衡一下使用一些高级功能带来的好处和对可移植性方面带来的损害,这会大大减少后期移植时面对的问题;另外,在应用架构设计时,也建议使用较好的框架去屏蔽这些差异 , 比如J2EE的Hibernate框架等 。
感谢伟大的Oracle,给我们提供了很多的高级功能,有很多是MySQL没有的 , 因此,在移植时你不得不放弃一些非必须的功能,比如,全表cache、物化视图、函数索引等;如果该功能是必须的,您可能要使用别的方式来实现,或者转到应用程序层面来考虑 。当然 , 这些功能MySQL今天没有 , 不代表明天也没有,我们可以拭目以待 。
由于开源软件的原因 , MySQL的bug或者缺陷有时还会干扰你,请仔细测试和优化您的应用程序,调整MySQL的配置参数,确保它可以运行得和Oracle下一样好 。
(责任编辑:王倩)
oracle计算四分位改成mysql1.首先我们确定oracle数据库中的数据库可用,我们打开navicat,依次点击连接-oracle,连接名可以自己随便定义
2.连接成功之后,我们的navicat就会出现这个标志,
3.接下来我们就要开始数据库之间的转换,首先我们在mysql新建一个数据库,由于之前我已经转换过一次,在此就不纠结数据库名了,字符集选择utf8mb4.
utf8和utf8mb4的区别:
??MySQL在5.5.3之后增加了这个utf8mb4的编码 , mb4就是most bytes 4的意思 , 专门用来兼容四字节的unicode 。
好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换 。当然,为了节省空间 , 一般情况下使用utf8也就够了 。
??那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了 。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP) 。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储 。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等 。
4.创建完数据库之后,我们需要将Oracle中的表转到mysql,依次点击工具-数据传输,源数据就选择Oracle数据库中需要转换的数据库,目标数据库就选择我们新建的数据库,点击选项,在遇到错误时继续打勾,点下一步
5.选择我们需要转储的数据 , 本次转换只转换表结构 , 视图的转换稍微有些麻烦,因为mysql视图不支持子查询 。点击开始
6.接下来我们需要看数据的转换过程中发现了哪些错误 , 我们要将这些错误记录下来,可能由于某些元素会导致某些表转换不成功,这时就需要我们在转换完成后自己手动去创建这些表 。
7.由于数据库中的大小原因会导致转换的时间长度,在转换完成后,可以看到上面报了多少错误,然后我们复制日志文件,打开notepad , 将日志复制进去,查找 [ERR],通常的提示都是这种,我们需要记录下该表,
8.由于完整的转换时间比较长,通常在转换完成后复制整个日志文件 , 查找[ERR]就可以看到转换中出现的错误,可能会出现重复的表名,重复的我们只需要记住一个即可 。我们需要记住的是报错语句的上一条记录的表名,我们记下来这写问题表,等下来处理 。
9.在数据转换完成后,会有一些问题,就是在转换的过程中,oracle中的integer类型会在mysql中转换成decimal类型,date类型也会出现一些问题 , 就会出现下面这种情况,这时就需要我们将这些字段更改
10.我们对转换好的mysql数据库点击右键-转储sql文件-仅结构
11.转储完成后打用notepad打开sql文件,将decimal(x,x)全部替换为int,如果有datetime类型的,将datetime(0)转换成datetime
12.保存之后我们再新建一个数据库,和刚才一样,选择我们刚创建的数据库 , 右键,运行sql文件 , 选择我们改过的sql文件
13.运行成功后,目前,我们jaranmes3中的数据是对的 , jranmes4中的表结构是对,所以我们需要将此同步一下 , 这里我们选择将jranmes4中的结构同步到jranmes3,选择工具-结构同步,选择好后点击比对,确定没什么问题选择部署,运行
14.更改完表的结构,我们需要对刚才转换中出现错误的表进行重新创建,我们根据记录的表明,在PL/SQL中搜索表名,右键点击查看-查看sql
??在更改时,我们不需要关心表空间,只需要在创建表的时候添加上主键,创建索引就可以了 。
??比如上面的sql,在mysql中,我们需要写成
-- Create table
create table UTILS_OBJ_ASSOCHECK
(
masterobj VARCHAR2(64) not null,
slaveobj VARCHAR2(64) not null,
keyattrsrel VARCHAR2(256) not null,
primary key (KEYATTRSREL, SLAVEOBJ, MASTEROBJ)
)
有的表可能包含的有索引,类似下面这样的语句.
??在mysql中不能使用这种方法来添加索引,上图中我们添加的是普通索引,我们需要查找对应的sql语句 , 我们应该使用下面的方式来添加索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
所以,上面的语句我们可以写成
ALTER TABLE BIZ_REPORT_BOX_BATCH_ASSO ADD INDEX BIZ_REPORT_BOX_BATCH_ASSO (BATCHNO, BOXNO)
有时候PLSQL中添加的是唯一索引,我们需要使用mysql添加唯一索引方式的语句,以下面的格式
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
??需要注意的是:mysql中没有varchar2类型 , 且有时varchar2(255)会导致长度太长无法完成建表,所以我们在PL/SQL复制完建表语句后,还需要我们去更改建表语句,比如将varchar2改成varchar,将number改为int 。
15.根据上面的步骤 , 将我们转换中遇到问题的表全部重新更新一下就可以了
怎样将Sqlserver数据库转成mysql数据库您好,很高兴为您解答 。\x0d\x0a\x0d\x0a1、MYSQL的工具使用navicat;\x0d\x0a2、SQL在安装的时候,需要安装SQL native Clent,并且开启服务;\x0d\x0a3、在navicat中创建数据连接,创建一个对应的空数据库\x0d\x0a4、创建数据库后,打开数据库 , 选择导入向导\x0d\x0a\x0d\x0a5、导入向导里 , 选择ODBC\x0d\x0a\x0d\x0a6、点下一步,导入里面选择sql native client;\x0d\x0a\x0d\x0a7、下一步,选择使用windows NT 集成安全设置,数据库选择你要转换的数据库,确定\x0d\x0a\x0d\x0a8、如表结构完全一样,那么就全选数据表吧,确定,因我们是新建的数据库,里面是空的 , 那么默认是创建表,如果是要导入到已经有的表结构里,则在目标表里选择要导入的目标表,然后选字段 。注意在第6步的时候,选对表的主键进行设置!\x0d\x0a\x0d\x0a9、如果是添加数据,则选择:添加记录到目标表;如果是需要ID值跟源数据库一致,则选择复制,删除目标全部数据,并从源数据重新导入\x0d\x0a\x0d\x0a注意 , 导入的时候 , 如果是已存在表结构 , 则键位不能空 , 如果是添加数据,则ID值空着,不要添加主键 , 在导入过程中如果出现错误,则根据出错提示处理,此方法绝对可以!\x0d\x0a\x0d\x0a如若满意,请点击右侧【采纳答案】,如若还有问题 , 请点击【追问】\x0d\x0a\x0d\x0a希望我的回答对您有所帮助,望采纳!\x0d\x0a\x0d\x0a~ O(∩_∩)O~
请问如何将oracle数据库中的数据迁移到mysql数据库中? 谢谢建议使用工具来做,直接手工命令相当甲骨文怎么转mysql的麻烦甲骨文怎么转mysql的 。
1、
建议使用甲骨文怎么转mysql:Toad for Oracle 10、PLSQL Developer等Oracle工具操作 。
把Oracle数据库中甲骨文怎么转mysql的数据转为文本或Excel或保存为sql插入语句 , 再插入Mysql中,这样就不存在接口字符集差异问题 。
2、
也可以使用管道方式直接导入,使用PowerBuilder工具导入 。
直接dmp是不现实的甲骨文怎么转mysql!
逻辑模型转化为MySQL数据库表模型转化为数据库有很多种方法 。
一种是直接在数据库新建 , 数据库新建比较直接也相对比较麻烦表格关系不是很直观,第二种是新建一个物理模型,每建一个模型就新增一个 , 这样效率低,而且关系每连接而我写的就是第三种 。第三种是新建好模型后 , 连接各模型关系在生成数据库表,这样比较思路清晰,关系更明确 。
先新建一个物理模型,接着新建表,字段,在简单的连接各表的关系 。
关于甲骨文怎么转mysql和如何将甲骨文翻译成现在文字的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 快手从不直播的人,快手不直播有钱吗
- 2018年度html5框架,html5框架代码
- mysql的优化有哪几种 mysql常见的优化方式
- mysql合并两个表字段,mysql合并两个表格的数据
- 电脑里怎么连接到电视上看,电脑怎么连接到电视上面去
- c语言关于调用函数的知识 c语言调用函数的简单例子
- 美丽营区公众号怎么关注的简单介绍
- 怎么加音乐在u盘里,怎么加音乐在u盘里面
- 下载楞严咒,下载楞严咒女声最曼的晋闻视频