`
jayyanzhang2010
  • 浏览: 371697 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle to MySQL

阅读更多

1.java 实体的移植

  主键生成策略有JPA 提供与Hibernate 提供之分

 JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
     TABLE:使用一个特定的数据库表格来保存主键。 
     SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
     IDENTITY:主键由数据库自动生成(主要是自动增长型) 
     AUTO:主键由程序控制。 

这里如果是mysql数据库一般使用Identity,Oracle 使用Sequence。 当使用Auto时,如果使用Oracle且配置了Sequence则使用Sequence,Mysql则使用Identity 。主键生成策略应该配置为Auto 并配置Squeuence,Oracle转mysql 则不会有问题。

 

2.DDL的问题

Orcale 里可以写 create or replace table  Table_name 

Mysql  需要变换为  Drop Table Table_name if exists table_name

                                create table table_name

3.Mysql需要对自增主键添加 auto_increment

   Oracle中一般会先建立表然后通过 alter table 设置表的 主键,这时需要注意,我们需要将主键定义在create table语句中进行。

4.Mysql引擎的选择

  Mysql5.*默认为Innodb,支持事物以及行锁表锁,所以应选择Innodb  ,但是对于使用空间数据的情况需要使用MyISAM,因为Innodb不支持空间数据

5.数据类型的转换

  下表是数据类型映射的表

 
 
MySQL Data Type Oracle Data Type

BIGINT

NUMBER(19, 0)

BIT

RAW

BLOB

BLOB, RAW

CHAR

CHAR

DATE

DATE

DATETIME

DATE

DECIMAL

FLOAT (24)

DOUBLE

FLOAT (24)

DOUBLE PRECISION

FLOAT (24)

ENUM

VARCHAR2

FLOAT

FLOAT

INT

NUMBER(10, 0)

INTEGER

NUMBER(10, 0)

LONGBLOB

BLOB, RAW

LONGTEXT

CLOB, RAW

MEDIUMBLOB

BLOB, RAW

MEDIUMINT

NUMBER(7, 0)

MEDIUMTEXT

CLOB, RAW

NUMERIC

NUMBER

REAL

FLOAT (24)

SET

VARCHAR2

SMALLINT

NUMBER(5, 0)

TEXT

VARCHAR2, CLOB

TIME

DATE

TIMESTAMP

DATE

TINYBLOB

RAW

TINYINT

NUMBER(3, 0)

TINYTEXT

VARCHAR2

VARCHAR

VARCHAR2, CLOB

YEAR

NUMBER

 

 

主要关注date,number,varchar2 的转换。其中需要注意 varchar2 的转换,因为在oracle 中varchar2表示存储的字节数,与编码有关,而mysql中varchar则没有,mysql中varchar(30)表示存储30个字符,所以此处需要注意。至于date 因为不需要支持微妙,所以我使用timestamp储存了。

6.常用的系统函数变化

   to_date --> char_to_date     to_char-->date_to_char     ||-->concat

7. hql 中需要注意,避免使用原始sql尽量使用hql,尤其是日期处理。对于空串的处理,在oracle中 varchar2下传入空串则oracle作为 null处理,所以你搜索空串是无结果的

   但是mysql中是有空串的. mysql中需要为子查询设置别名要么也会报错。分页查询,mysql中没有rownum,可以使用limit实现,建议使用hql。

8.注意切换hibernate方言

9.触发器与存储过程

   oracle的触发器比较高端,对于行触发器支持到按照某列改变触发,而mysql只支持行触发。 oracle中可以判断当前操作类型update,delete 还是 insert,mysql只能分开写    了。变量声明的语法也不相同,需要注意(会详细写一篇)

10。获取当前使用的数据库

   我的方法比较屌丝根据Hibernate方言判断使用哪种

              

  11.一些语法上的限制

   1).  Every derived table must have its own alias

   遇到这个问题驱动表需要有一个别名,比如 select sum(money) sum from (select * from guest limit 0,10) t;

   2)delete from decode_resource re  where re.decode_resource_id=1

  这个地方原因未知,delete 中不可以表的别名?去掉re即可  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics