热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

数据库迁移及及区别(Oracle,MySQL,SQLServer)-mysql教程

转自:blog.sina.com.cnsblog_4f9ce8f30100q52i.html导言:最近的数据超市项目需要从SQLServer迁移到MySql。在之前并没有很多数据库迁移方面的经验,所以也不知道迁移需要花费多久,都要做什么工作。通过几天的工作,项目已经顺利迁移到M

转自: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 项目中的SQL修改

1.4 数据库连接(驱动)

1.5 连接项目中的程序,测试并修改程序

2、常用数据库中在开发方面的不同

2.1 数据类型

2.2 自增

2.3 分页

2.4 内置函数

2.5 模糊查询

3、ORM工具与迁移

使用hibernate、ibatis,在数据库迁移中的不同效率

4、各数据库的不同数据类型比较及参考资料

4.1MySQL中的建表SQL

4.2JavaSQL数据类型影射表

4.3MySqlOracle数据类型的相互转化

4.4ORACLESQLSERVERMYSQL的数据类型对照表

1、数据库迁移需要做的工作

1、1 数据库建表脚本的修改

1.1.1 由于各种数据库的数据类型并不相同,需要更改部分数据类型。

1.1.2 在MySQL脚本里暂不能给日期数据设置当前时间,字段如:registertime(注册时间);需在程序中设置当前日期,再保存进数据库或将registertime设置为时间戳(timestamp

1.1.3 MySQL里的表和字段的注释,见【5】中的建表语句。

1、2 将数据导入到目标数据库的中(其中可以需要修改数据类型)

1.2.1设置数据库的编码,防止中文乱码

1)最简单的修改方法,就是修改mysqlmy.ini文件中的字符集键值,

如:default-character-set = utf8

character_set_server = utf8

修改完后,重启mysql的服务,service mysql restart

2)还有一种修改字符集的方法,就是使用mysql的命令,如:

mysql> SET character_set_client = utf8 ;mysql> SET character_set_connection = utf8 ;

mysql> SET character_set_database = utf8 ;mysql> SET character_set_results = utf8 ;mysql> SET character_set_server = utf8 ;mysql> SET collation_connection = utf8 ;mysql> SET collation_database = utf8 ; mysql> SET collation_server = utf8 ;

如果:没有设置前两条,可以通过以下方式实现编码:

a 数据库设置数据库支持的编码:create database datmart charset=utf8; b 使用数据库datmart use datmart; c 插入中文数据时,需要先设置:set names utf8; d 数据导入 source d:\datmart.sql

(每个见表语句后加:ENGINE=MyISAM DEFAULT CHARSET=utf8;)

1.2.2 数据类型

即使MySQL中有bit,但SQLServer中的bit类型(取0或1,分别对应了booltruefalse)的变量在MySQL中,不能顺利导入。需要将其设置为tinyint(1),才能顺利导入。

12.3导入数据

采用第三方工具,如Navicat 8,通过微软提供的ODBC连接数据源,并导入数据或者自己写一个通用程序,将全部数据读入在写进新的数据库中。

1、3 修改项目中的SQL,使得SQL在目标数据库里也可以使用

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.2内置函数、2.3自增 2.4存储过程 2.5模糊查询

2.1 分页

Oracle中的分页:可以采用rownumber实现;SQLServer中的分页,采用内容函数row_number() 实现;MySQL中采用limit。

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 id<41 order by enname desc limit 5,200

2.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 -- 不设置最大&#20540;

NOCYCLE -- 一直累加,不循环 CACHE 10;

使用:emp_sequence.CURRVAL emp_sequence.NEXTVAL

2.3.3 自增带来的问题及其解决

问题:(oracle中的自增字段,如果它的&#20540;不是连续的,并且您将其做为主键,那么迁移到其它数据库时候,那些不连续的&#20540;发生了改变。而其它表是与该字段关联的,这样程序就会出错)

解决方式:在目标数据库中建立统一的表,并有同样的字段但不自增;导入数据后,再修改表的结构,使得该字段自增。

2.3.4 自己实现id字段的自增的SQL语句

insert into orderApi (id,ordernumber,apiid)

select distinct IFNULL((select max(id)&#43;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#,是方法中传入的&#20540;;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.2JavaSQL数据类型影射表

String

VARCHAR or LONGVARCHAR

java.math.BigDecimal

NUMERIC

Boolean

BIT

Byte

TINYINT

Short

SMALLINT

Int

INTEGER

Long

BIGINT

Float

REAL

Double

DOUBLE

byte[]

VARBINARY or LONGVARBINARY

java.sql.Date

DATE

java.sql.Time

TIME

java.sql.Timestamp

TIMESTAMP

4.3 MySqlOracle数据类型的相互转化

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

4.4 ORACLESQLSERVERMYSQL的数据类型对照表

Oracle 数据类型

SQL Server 数据类型

Mysql数据类型

BFILE

VARBINARY(MAX)

BLOB

VARBINARY(MAX)

BLOB, LONGBLOB, MEDIUMBLOB

CHAR([1-2000])

CHAR([1-2000])

CHAR

CLOB

VARCHAR(MAX)

TEXT, LONGTEXT, MEDIUMTEXT

DATE

DATETIME

DATE,DATETIME, TIME, TIMESTAMP

FLOAT

FLOAT

REAL,

DECIMAL, DOUBLE, DOUBLE PRECISION

FLOAT([1-53])

FLOAT([1-53])

FLOAT([54-126])

FLOAT

INT

NUMERIC(38)

INTERVAL

DATETIME

LONG

VARCHAR(MAX)

LONG RAW

IMAGE

NCHAR([1-1000])

NCHAR([1-1000])

NCLOB

NVARCHAR(MAX)

NUMBER

FLOAT

INT, INTEGER, NUMERIC, YEAR, MEDIUMINT

NUMBER([1-38])

NUMERIC([1-38])

SMALLINT, TINYINT, BIGINT

NUMBER([0-38],[1-38])

NUMERIC([0-38],[1-38])

NVARCHAR2([1-2000])

NVARCHAR([1-2000])

SET, VARCHAR, ENUM

RAW([1-2000])

VARBINARY([1-2000])

BLOB,BIT, TINYBLOB, LONGTEXT, LONGBLOB, MEDIUMBLOB, MEDIUMTEXT

REAL

FLOAT

ROWID

CHAR(18)

TIMESTAMP

DATETIME

UROWID

CHAR(18)

VARCHAR2([1-4000])

VARCHAR([1-4000])

TEXT, TINYTEXT






        
推荐阅读
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 本文详细介绍了如何利用Xshell配合Xftp实现文件传输,以及如何使用Pure-FTPd构建FTP服务,并探讨了VSFTP与MySQL结合存储虚拟用户的方法。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
author-avatar
youth冰点
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有