将数据从MySQL迁移到Oracle的注意事项

将数据从MySQL迁移到Oracle的注意事项

1.自动增长的数据类型处理

MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记)

INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;

INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL

2. 单引号的处理

MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。当然你如果使用 Convert Mysql to Oracle工具就不用考虑这个问题

3.长字符串的处理

在ORACLE中,INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串,
请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。

4. 翻页的SQL语句的处理

MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。

以下是经过分析后较好的两种ORACLE翻页SQL语句(ID是唯一关键字的字段名):

语句一:

SELECT ID, FIELD_NAME,.. .

FROM TABLE_NAME

WHERE ID IN (SELECT ID

FROM (SELECT ROWNUM AS NUMROW, ID

FROM TABLE_NAME

WHERE 条件1

ORDER BY 条件2)

WHERE NUMROW > 80

AND NUMROW < 100)

ORDER BY 条件3;

语句二:

SELECT *

FROM ((SELECT ROWNUM AS NUMROW, c.*

from (select FIELD_NAME,.. .

FROM TABLE_NAME

WHERE 条件1

ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100)

ORDER BY 条件3;

5. 日期字段的处理

MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 精确到秒。

日期字段的数学运算公式有很大的不同。

MYSQL找到离当前时间7天用:DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)

ORACLE找到离当前时间7天用:DATE_FIELD_NAME >SYSDATE - 7;

6. 字符串的模糊比较

MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果。

7. 空字符的处理

MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

Oracle移植到mysql注意事项

客户用的数据库是mysql,而研发好的产品支持oracle,我们必须把数据库环境从oracle移植到mysql。在移植的过程中碰到了下面一些问题,如果我们在最初的设计、编码过程中注意数据库的移植性,这种情况下可以完全不需要作额外工作。

一、数据库环境从oracle移植到mysql碰到的问题

1、 大小写敏感的区别(如果服务器OS是linux)

在oracle中一般情况下不区分大小写。有时候我们在使用oracle不注意大小写的问题,表名和字段名不加双引号是不区分大小写的,像这样:insert
into tableName 和 insert into
TABLENAME效果是一样的,用工具导出创建/数据初始化脚本,得到的结果一般表名和字段名转化成了大写。

但在MySQL中,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。数据库对应数据目录中的目录,数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,使用数据库或表实际上是操纵这些文件(夹),所以使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。在以linux为内核的操作系统中是大小写敏感的。

解决的办法,是把mysql的数据库名和oracle的大小写保持一致,表名与应用程序中sql字符串中的表名保持一致,如果应用程序中字段名用了双引号,那请把sql中的字段名大小写与双引号里的字符保持一致。如果你的应用程序所引用的表名、字段没有统一大小写,那麻烦就大了。

2、保留字的区别

像sql语言的函数名(如:inteval,show)等是保留字。Oracle中保留字是可以作为表名和字段名,并且不影响使用,但mysql中保留字是不能作为表名和字段名,如果使用会报语法错误。

解决办法,把sql语句中的保留字用‘`’符号引起来,这个符号位于键盘的tab键上面;如果是字段名还有另外一种方法tablename.字段名。像这样:

insert into tablename (id, `interval`) value(…..

insert into tablename (id, tablename.inteval) value(…..

3、自动增长类型的区别

Oracle有sequence,mysql中没有,但有auto_increment属性。

解决办法是把Oracle中sequence转换成使用auto_increment属性,某些情况可能还有一种办法可以解决问题,新建一个独立的表用来专门记录自动增长型的数据。

4、数据类型的区别

在mysql中没有像oracle中的varchar2、number,mysql有与之对应的varchar、numeric,当然在oracle中没有mysql的time类型。

解决办法是替换。

5、索引长度限制的区别

从MySQL 4.1.2开始,MyISAM和InnoDB表索引长度支持1000字节,也就是说索引字段的长度不能超过1000

字节,如果超过会报这样的错:

ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes。

如果是UTF-8编码,相当于333个字符的长度(因为UTF8一个字符占3个字节)。Oracle的索引长度限制比mysql要宽松得多。

解决的办法就不必要多说了,要么改索引的定义,要么改字段的定义长度。

二、为了数据库的兼容性我们应该注意些什么

数据库的兼容性应该是数据库设计应该重视的一个问题,因为有时候客户存在已经在用的数据库,并且不希望同时维护两个数据库,这样的话兼容多种数据库还能成为产品的一个卖点。

作到数据库的兼容性关键是遵守标准用法。

1、 遵守标准用法,尽量不使用某种数据库特有的用法

如msyql的‘`’符号的用法,再比如,很多人有这种用法,在使用oracle开发的时候创建sequence,往表中插数据之前先SELECT
seq.nextval FROM
DUAL;,然后把查询得到的值作为value插入表中,这种用法没法适应没有sequence的数据库,每个数据库都有自动增长型的用法,如果需要使用就应该完全地使用。

再举个例子,不同的数据库对分页查询作了扩展,postgresql有offset,limit,oracle就没有。

2、 保留字

要求数据库设计者尽量不使用保留字作表名和字段名。也有很多人有这种用法,在表名和字段名前加‘_’,

像这样:create table _tablename ( _id integer)。这样永远不会出现保留字引起的问题。

3、 避免数据库大小写敏感的问题

选择数据库表名和字段名采用大写还是小写,并且在数据库的设计和编码过程中完全统一。

当使用 Convert Oracle to Mysql 工具时,请注意“名称转换为大写”这个选项的控制

作者:Linux

来源:51CTO

时间: 2024-11-16 08:50:38

将数据从MySQL迁移到Oracle的注意事项的相关文章

数据从MySQL迁移到Oracle 需要注意什么_Mysql

将数据从MySQL迁移到Oracle的注意事项,有如下几点 1.自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段.CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; INSERT 语句插入这个字段值为:

从 MySQL 迁移到 Oracle (傻瓜篇)

如果用关键字 "MySQL 迁移 Oracle" 在网上搜索,基本上得到的内容都是关于从 Oracle 如何迁移到 MySQL 的,而从 MySQL 迁移到 Oracle 的信息则少之又少. 抛开那些手工一点点做的方法不谈,网络上也可以找到一些第三方工具来做这个事情,免费的? 我只找到了一个,那就是 了.如果采用比较傻瓜化的方法,不妨考虑这个工具.在这个工具之前,Oracle 提供了单独的 工具.在 配置 MySQL JDBC: 还需要注意一点就是需要调整一下迁移时候的参数: 剩下的事

项目从mysql迁移到oracle报错

问题描述 项目从mysql迁移到oracle报错 本来没有一点错误,迁移之后出现了很多,不知道哪位大神见过下面的问题: 17:23:54,967 ERROR BasicPropertyAccessor:118 - IllegalArgumentException in class: com.ebupt.dataWarehouse.entity.dataQualityMonitoring.MonTaskConEntity, setter method of property: TemporaryI

通过IBM Migration Toolkit的支持把数据从MySQL迁移到DB2和Informix Dynamic

MySQL 迁移支持 在 2007 年初,IBM Migration Toolkit 2.0.2.0(MTK)实现了对从 MySQL 4.x 和 5.x 迁移到 DB2 和 Informix Dynamic Server(IDS)目标的有限支持.后续的 MTK 版本改进了最初的支持.改进的支持包括迁移某些 DDL 和 DML 语句. MTK 支持对以下 MySQL SQL 语句的完全转换: CREATE TABLE 语句 CREATE INDEX 语句 MTK 还在很大程度上支持以下 MySQL

将MySQL迁移到Microsoft SQL Server 2000 (二)

mysql|server 用于数据迁移的 MySQL 工具 MySQL 提供了几个客户端工具和实用程序,最常用的有: mysql - 一个交互式客户程序,可以对数据库发布查询并查看结果 mysqldump - 此工具可以提取 MySQL 数据库中的架构和数据,并放到一个文件中 mysqlimport - 此工具可以读取文件中的架构和数据,并放到一个 MySQL 数据库中 mysqladmin - 此工具可以执行管理任务,比如创建数据库和删除数据库 myODBC - 一个 32 位的开放式数据库连

Mysql数据库向Oracle转换应注意的问题

有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到 ORACLE的需求,应用程序也要相应做一些修改. 本人总结出以下几点注意事项,希望对大家有所帮助. 1. 自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值. ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋

将MySQL迁移到Microsoft SQL Server 2000 (二)-数据库相关-PHP教程

用于数据迁移的 MySQL 工具 MySQL 提供了几个客户端工具和实用程序,最常用的有: mysql - 一个交互式客户程序,可以对数据库发布查询并查看结果 mysqldump - 此工具可以提取 MySQL 数据库中的架构和数据,并放到一个文件中 mysqlimport - 此工具可以读取文件中的架构和数据,并放到一个 MySQL 数据库中 mysqladmin - 此工具可以执行管理任务,比如创建数据库和删除数据库 myODBC - 一个 32 位的开放式数据库连接软件,可提供 ODBC

使用MySQLMigrationToolkit快速将Oracle数据导入MySQL

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非关系型数据库,所以干脆一起研究一下,对比学习中找不同,首先说一下本人使用的数据库版本和可视化工具 Oracle10G-PL/SQL Developer9 MySQL5.5.29-MySQL Workbench6.0 MongoDB2.4.9(32bit最大2G)-Robomongo0.8.4 为

oracle数据导入mysql数据库日期格式问题

问题描述 oracle数据导入mysql数据库日期格式问题 从oralce数据库导出日期格式数据为 to_date('13-04-2015 16:40:12', 'dd-mm-yyyy hh24:mi:ss'), 如何把它修改为yyyy-mm-dd的形式存储到mysql数据库中,由于数据比较多,一条条修改太过麻烦,有没有什么好的方法 解决方案 参考import CSV to MySQL and convert date LOAD DATA LOCAL INFILE '/Users/Path/To