读书人

mydql-oracle项目迁徙简说

发布时间: 2012-08-08 14:32:45 作者: rapoo

mydql--oracle项目迁移简说

?

从4月18到现在,十天的时间。

?

也是,从接到这个单,从当时的混乱到了如果走向最后收尾的时候了。

?

这是第一次,做数据库的迁移,所以,决定记录下来这样一个历程。

?

环境: eclipse? 3.0

框架结构:WSI (webwork + spring+ ibaits)

? ??????

1 数据结构迁移。

?

? ?在这里介绍一个工具,oracle官网可以下到,SQLDEVELOPER,现在的版本已经到了3.4或者4.0.,但是我推荐用的1.2,因为版本虽低,但是用于数据库迁移却很方便。

? ?第一步,需要导入mysql的驱动

??Tools-->preferences:

? ? ? ? ? ? ? 附件--图片1

?

然后建立连接:

? ? ? ? ? ? ? 附件--图片2

?

接下来就是进行迁移了,迁移有两种方式:

第一种: 普通迁移

? ? ? ? ? ? ? 附件--图片3

?

??? 然后选择表或者数据库

? ? ? ?附件--图片4

?

变量

Mydql

Oracle

字符型

Varchar

Varchar2

Char型

Char

整型

Int

Number[10,0]

浮点型

Double

Float[24,0]

中等长度

Mediumblob

Long raw

文本

Text

Clob

长文本

MediunText

Clob

日期

Date

Date

?

<!--[if !supportLists]-->2?????????<!--[endif]-->数据迁移

<!--[if !supportLists]-->2.1?????????<!--[endif]-->表名去除单引号

很多时候,为了防止关键字的情况下,在往mysql插入数据时,往往会把表名放在单引号里,而在oracle里面是行不通的、所以,第一步,就是需要把所有的单引号去掉。

<!--[if !supportLists]-->2.2?????????<!--[endif]-->日期转换问题

在oracle里面,date型数据插入是一个很大的问题,日期格式默认情况下是‘04-9月 -01’,

而我们的数据却是’2011-11-11’格式的,怎么处理呢?

大多数人会想到to_date函数

to_date(‘2011-11-11’,’yyyy-MM-dd’);

当然,在数据量不大的情况下,这种方法是可行了,可是,如果你需要插入的是好几万,甚至是几十万书句的时候,这种方式就行不通了,在这里就说说第二种方法。

改变oracle日期的默认格式。

Alter session setnls_date_format = ‘yyyy-MM-dd hh24:mi:ss’

注意的是,这只是暂时保存在session作用域,当你一旦关闭的时候也就得重新执行一次。

<!--[if !supportLists]-->2.3?????????<!--[endif]-->&问题

在oracle里面,&是表示用户输入的标识,而在实际情况中,想text里面插入值得时候,很有可能是大片文章,那么,相对应的,也就可能出现了&nbsp&quot等符号的标识,我采取的方法是把所有这种标识去掉。

而如果不想去掉的话,可以采用[]把&包起来,也可达到相同的效果。

<!--[if !supportLists]-->3?????????<!--[endif]-->项目迁移

3.1 ??更改数据库连接配置

? ? ? ???jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc\:oracle\:thin\:@localhost\:1521\:ID

?

<!--[if !supportLists]-->3.2?????<!--[endif]-->SQL文的改变

总的概括:函数、limit分页、视图和索引、GROOUP BY

关于函数:

??? 3.2.1DATEDIFF

????? A? 用trunc代替

????? B? 自己写函数(示例)

?

? ??3.2.2 系统日期函数

???????? Mysql: select sysdate()

?????? Oracle : select sysdate from dual;

在此省略一步分函数,因为mysql函数比较强大,所以具体的时候碰到了网上搜索对应的方案把。比如date_add等等。

?

CREATE ALGORITHM=UNDEFINEDDEFINER=`username`@`%` SQL SECURITY DEFINER VIEW viewname

?????????????????????????????? Oracle: create or replace view viewname

?

???????? 关于group by?

????????????? 在oracle里面,有个规定,含有group by的查询语句,字段类不在聚合函数中,就必须在group by语句后,我的说法是,你把字段列加到group by 后面就可以了。

?

? 下面说个insert和update的问题:

? (具体点击http://itstudy123.iteye.com/blog/1012635)

? 向一个表中执行update和insert操作时,类型为CLOB列的就出现异常

? 异常为:

? 仅可以为插入 LONG 列的 LONG 值赋值 CLOB

? ?............

?

? 当时上网查了,有很多人也碰到了相同的问题,总体而言有两种解决方式,

? 第一种是驱动版本过低。

? 第二种是修改hibernate的配置文件,当时,前提是你开发的持久层必须是hibernate。

?

? 我从oracle官方网站下了一个最新的JDBC驱动(通过附件上传了),运行还是报哪个错误。没有效果

? 而第二种方法,对于我而言,是肯定行不通的。

?

? 网上有部分人说,值长度在2000-4000之间会出现异常,

? 可是,我的不同,

? 我的是值的长度在1000-2000之间会出现异常,稍短或长都没问题。

?

? 在这里说明一下,肯定不会是因为长度限制的问题,因为CLOB在ORACLE里面,所输入的可达4G。

? 对于LONG,这个类型我没用过,在ORACLE里面也不建议用。是一个已经被废弃了的类型。

?

? 最后我的解决方法是,在视图层,对所输入的进行判断,把少了的用空格不上,在jsp中,四个空格等于一个字符的长度。

让其长度超过2000即可,但是,这种方法对于紧急情况可能还不错,而效率上就不说了。

还有,就是说,如果你的长度不会超过2000,就建议用varchar2,但是需要注意的是数据库字符集应该是UTF-8的,对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。

.............

?

?

总的来说,最主要的就是sql问题,认真仔细点就好。关于迁移,是一个工作量比较大,但是技术含量比较低的工作,所以,每一步走稳,每一步走好是最重要的。

?

读书人网 >其他数据库

热点推荐