数据库迁移及及区别(Oracle,MySQL,SQLServer)
转自:http://blog.sina.com.cn/s/blog_4f9ce8f30100q52i.html 导言:最近的数据超市项目需要从SQLServer 迁移 到MySql。在之前并没有很多 数据库 迁移 方面的经验,所以也不知道 迁移 需要花费多久,都要做什么工作。通过几天的工作,项目已经顺利 迁移 到M
转自:http://blog.sina.com.cn/s/blog_4f9ce8f30100q52i.html
导言:最近的数据超市项目需要从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:
select rn,first_name,salary from(select rownum as rn,frist_name,salary from (select first_name,salary from s_emp order by salary)) where rn between 11 and 20
SQLServer中的SQL:
select * from( select row_number() over(order by salary desc) as rownumber,* from s_emp where salary>3000 ) as tb where rownumber between 11 and 20;
MySQL中基本的SQL:
select * from apiinfo where id2.2
内置函数 数据库中有许多内置函数,不少是用于处理字符串、日期等的。
SQLServer的len(),相当于MySQL的length(),相当于Oracle的Len().
2.3
自增 2.3.1
自增关键字 Oralce:
SQLServer: identity MySQL:auto_increment 2.3.2
Oracle中的自增(序列号): 定义:CREATE
SEQUENCE emp_sequence INCREMENT
BY 1 -- 每次加几个 START
WITH 1 -- 从1开始计数 NOMAXVALUE
-- 不设置最大值 NOCYCLE
-- 一直累加,不循环 CACHE 10; 使用:emp_sequence.CURRVAL
emp_sequence.NEXTVAL 2.3.3
自增带来的问题及其解决 问题:(oracle中的自增字段,如果它的值不是连续的,并且您将其做为主键,那么迁移到其它数据库时候,那些不连续的值发生了改变。而其它表是与该字段关联的,这样程序就会出错)
解决方式:在目标数据库中建立统一的表,并有同样的字段但不自增;导入数据后,再修改表的结构,使得该字段自增。
2.3.4
自己实现id字段的自增的SQL语句 insert
into orderApi (id,ordernumber,apiid) select
distinct IFNULL((select max(id)+1 from orderApi),1),#ordernumber#,#apiid# from
orderApi group by id 2.4
存储过程 不同的数据库存储过程相差的比SQL间的差异到大,所以项目中的存储过程需要改不少地方。或者,如果对性能影响不大,可以不用存储过程。
2.5
模糊查询 在SQLServer中,模糊查询可以使用
select * from apiinfo where cnname like #key#+'%';
但在MySql中,则需改为:
select * from apiinfo where cnnamelike '%$key$%' or select * from apiinfo where cnname REGEXP '^['+#key#+']'注:#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
MySQL中的建表SQL: CREATE TABLE `apiindicator` ( `id` int(11) NOT NULL, `apiid` int(11) DEFAULT NULL COMMENT '关联api信息表(apiinfo)id', `cnname` varchar(100) DEFAULT NULL COMMENT '指标中文名', `enname` varchar(60) DEFAULT NULL COMMENT '指标英文名 ', `description` varchar(1000) DEFAULT NULL, `datatype` varchar(15) DEFAULT NULL, `isout` bit DEFAULT '1' COMMENT '是否必须输出 ,默认为输出;0:不输出 1:输出', `state` int(11) DEFAULT '0', `isdelete` bit DEFAULT '0' COMMENT '删除标记:0未删除;1已删除', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Api指标表 ';
4.2:Java到SQL数据类型影射表
|
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, |
推荐阅读
-
mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、启用事件(ENABLE)、事件重命名及数据库事件迁移操作详解
-
Oracle与Mysql主键、索引及分页的区别小结
-
Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构
-
加载MySQL、Oracle、SQL Server 2000、SQL Server 2005及以上版本 的加载数据库驱动程序
-
SqlServer Mysql数据库修改自增列的值及相应问题的解决方案
-
Oracle数据库中对null值的排序及mull与空字符串的区别
-
如何把sqlserver数据迁移到mysql数据库及需要注意事项
-
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
-
MySQL数据库char与varchar的区别分析及使用建议_MySQL
-
mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、启用事件(ENABLE)、事件重命名及数据库事件迁移操作详解