阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

103次阅读
没有评论

共计 3485 个字符,预计需要花费 9 分钟才能阅读完成。

将数据从 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 工具时,请注意“名称转换为大写”这个选项的控制

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/136804.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3485字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中