转自:http://blog.sina.com.cn/s/blog_4f9ce8f30100q52i.html
数据库迁移及及区别(Oracle,MySQL,SQLServer)
图:MySQL的第三方图形用户界面工具,可以方便查询、设计、导出导入数据(Navicat)
导言:最近的数据超市项目需要从SQLServer迁移到MySql。在之前并没有很多数据库迁移方面的经验,所以也不知道迁移需要花费多久,都要做什么工作。通过几天的工作,项目已经顺利迁移到MySql上。该文档总结了迁移的经验,同时也方便以后数据库迁移。
1、数据库迁移需要做的工作
1.1
1.2
1.3
1.4
1.5
2、常用数据库中在开发方面的不同
2.1
2.2
2.3
2.4
2.5
3、ORM工具与迁移
使用hibernate、ibatis,在数据库迁移中的不同效率
4、各数据库的不同数据类型比较及参考资料
4.1、MySQL中的建表SQL
4.2、Java到SQL数据类型影射表
4.3、
4.4、ORACLE与SQLSERVER、MYSQL的数据类型对照表
1、数据库迁移需要做的工作
1、1
1.1.1
1.1.2
1.1.3
1、2
1.2.1设置数据库的编码,防止中文乱码
1)、最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
如:default-character-set
(character_set_server
修改完后,重启mysql的服务,service
2)、还有一种修改字符集的方法,就是使用mysql的命令,如:
mysql>
mysql>
如果:没有设置前两条,可以通过以下方式实现编码:
a
(每个见表语句后加:ENGINE=MyISAM
1.2.2
即使MySQL中有bit,但SQLServer中的bit类型(取0或1,分别对应了bool的true和false)的变量在MySQL中,不能顺利导入。需要将其设置为tinyint(1),才能顺利导入。
12.3导入数据
1、3
1.4
SQLServer的数据库连接:
datamart_driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
datamart_url=jdbc:sqlserver://172.16.6.23:1433;DatabaseName=datamart
MySql的数据库连接:
datamart_driver=com.mysql.jdbc.Driver
datamart_url=jdbc:mysql://172.16.6.23:3306/datamart
Oracle的数据库连接:
datamart_driver=oracle.jdbc.driver.OracleDriver
datamart_url=jdbc:oracle:thin:@172.16.6.26:1521:datamart
用户名和密码都是:
datamart_username=root
datamart_password=sd100301
2、常用数据库中在开发方面的不同
2.1
2.1
Oracle中的分页:可以采用rownumber实现;SQLServer中的分页,采用内容函数row_number()
Oracle中的SQL:
SQLServer中的SQL:
select
where
MySQL中基本的SQL:
select
order
limit
2.2
数据库中有许多内置函数,不少是用于处理字符串、日期等的。
SQLServer的len(),相当于MySQL的length(),相当于Oracle的Len().
2.3
2.3.1
Oralce:
2.3.2
定义:CREATE
INCREMENT
START
NOMAXVALUE
NOCYCLE
使用:emp_sequence.CURRVAL
2.3.3
问题:(oracle中的自增字段,如果它的值不是连续的,并且您将其做为主键,那么迁移到其它数据库时候,那些不连续的值发生了改变。而其它表是与该字段关联的,这样程序就会出错)
解决方式:在目标数据库中建立统一的表,并有同样的字段但不自增;导入数据后,再修改表的结构,使得该字段自增。
2.3.4
insert
select
from
2.4
不同的数据库存储过程相差的比SQL间的差异到大,所以项目中的存储过程需要改不少地方。或者,如果对性能影响不大,可以不用存储过程。
2.5
在SQLServer中,模糊查询可以使用
select
但在MySql中,则需改为:
select
or
select
注:#key#,是方法中传入的值;MySQL中的SQL使用了REGEXP,是正则表达式
3、ORM工具与迁移
使用hibernate、ibatis,在数据库迁移中的不同效率
ibatis:sql需要自己写 hibernate:sql自动生成;
Hibernate的特点: Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快。
iBATIS的特点: iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
易迁移行比较:对于数据库迁移来说,常用的数据库操作,如增删改查等,在hibernate中基本不需要改动;而ibatis中是自己写的针对特定数据库类型的SQL,所以需要改不少内容。
4、各数据库的不同数据类型比较及参考资料
4.1
CREATE
)
4.2:Java到SQL数据类型影射表
String | VARCHAR |
java.math.BigDecimal | NUMERIC |
Boolean | BIT |
Byte | TINYINT |
Short | SMALLINT |
Int | INTEGER |
Long | BIGINT |
Float | REAL |
Double | DOUBLE |
byte[] | VARBINARY |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
4.3
BIGINT | NUMBER(19, |
BIT | RAW |
BLOB | BLOB, |
CHAR | CHAR |
DATE | DATE |
DATETIME | DATE |
DECIMAL | FLOAT |
DOUBLE | FLOAT |
DOUBLE | FLOAT |
ENUM | VARCHAR2 |
FLOAT | FLOAT |
INT | NUMBER(10, |
INTEGER | NUMBER(10, |
LONGBLOB | BLOB, |
LONGTEXT | CLOB, |
MEDIUMBLOB | BLOB, |
MEDIUMINT | NUMBER(7, |
MEDIUMTEXT | CLOB, |
NUMERIC | NUMBER |
REAL | FLOAT |
SET | VARCHAR2 |
SMALLINT | NUMBER(5, |
TEXT | VARCHAR2, |
TIME | DATE |
TIMESTAMP | DATE |
TINYBLOB | RAW |
TINYINT | NUMBER(3, |
TINYTEXT | VARCHAR2 |
VARCHAR | VARCHAR2, |
YEAR | NUMBER |
4.4
Oracle | SQL | Mysql数据类型 |
BFILE | VARBINARY(MAX) | |
BLOB | VARBINARY(MAX) | BLOB, |
CHAR([1-2000]) | CHAR([1-2000]) | CHAR |
CLOB | VARCHAR(MAX) | TEXT, |
DATE | DATETIME | DATE,DATETIME, |
FLOAT | FLOAT | REAL, DECIMAL, |
FLOAT([1-53]) | FLOAT([1-53]) | |
FLOAT([54-126]) | FLOAT | |
INT | NUMERIC(38) | |
INTERVAL | DATETIME | |
LONG | VARCHAR(MAX) | |
LONG | IMAGE | |
NCHAR([1-1000]) | NCHAR([1-1000]) | |
NCLOB | NVARCHAR(MAX) | |
NUMBER | FLOAT | INT, |
NUMBER([1-38]) | NUMERIC([1-38]) | SMALLINT, |
NUMBER([0-38],[1-38]) | NUMERIC([0-38],[1-38]) | |
NVARCHAR2([1-2000]) | NVARCHAR([1-2000]) | SET, |
RAW([1-2000]) | VARBINARY([1-2000]) | BLOB,BIT, |
REAL | FLOAT | |
ROWID | CHAR(18) | |
TIMESTAMP | DATETIME | |
UROWID | CHAR(18) | |
VARCHAR2([1-4000]) | VARCHAR([1-4000]) | TEXT, |