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 东西时,请注重“称号转换为大写”这个选项的掌握