MySQL向Oracle迁移数据注意事项1、自动增长数据类型处理MYSQL有一个自动增长数据类型。插入记录时,不需要操作该字段,它会自动获取数据值。ORACLE没有自动增长的数据类型。有必要创建一个自动增长的序列号。插入记录时,应将序号的下一个值赋给该字段。CREATESEQUENCE序号名称(***为表名+序号标记)INCREMENTBY1STARTWITH1MAXVALUE99999CYCLENOCACHE;INSERT语句插入此字段值:序列号名称.NEXTVAL2。MYSQL中对单引号的处理Strings可以用双引号包起来,而ORACLE中只能用单引号。在插入和修改字符串之前必须替换单引号:用两个单引号替换所有出现的单引号。当然,如果你使用ConvertMysqltoOracle工具,就不用考虑这个问题了。3、长字符串的处理在ORACLE中,INSERT和UPDATE时最多可操作的字符串长度小于或等于4000个单字节。如果要插入比较长的字符串,请考虑字段使用CLOB类型,方法借用ORACLE自带的DBMS_LOB包。在插入和修改记录之前,必须进行非空和长度判断。不能为空的字段值和超过长度的字段值应该警告并返回上次操作。4、翻页SQL语句的处理MYSQL对翻页SQL语句的处理比较简单。使用LIMIT开始位置并记录数量。ORACLE处理翻页的SQL语句比较麻烦。每个结果集只有一个ROWNUM字段来标记其位置,并且只能使用ROWNUM<100,不能使用ROWNUM>80。以下是经过分析的两条不错的ORACLE翻页SQL语句(ID为unique关键字的字段名):语句1:SELECTID,FIELD_NAME,..FROMTABLE_NAMEWHEREIDIN(SELECTIDFROM(SELECTROWNUMASNUMROW,IDFROMTABLE_NAMEWHERE条件1ORDERBY条件2)WHERENUMROW>80ANDNUMROW<100)ORDERBY条件3;语句2:SELECT*FROM((SELECTROWNUMASNUMROW,c.*from(selectFIELD_NAME,...FROMTABLE_NAMEWHEREcondition1ORDERBYCondition2)c)WHERENUMROW>80ANDNUMROW<100)ORDERBYCondition3;5、日期字段处理MYSQL日期字段分为DATE和TIME两种类型,而ORACLE日期字段只有DATE,包含年月日时分秒信息。使用当前数据库的系统时间为SYSDATE,精确到秒。日期字段的数学公式完全不同。使用MYSQL查找距当前时间7天:DATE_FIELD_NAME>SUBDATE(NOW(),INTERVAL7DAY)ORACLE查找距当前时间7天:DATE_FIELD_NAME>SYSDATE-7;6、字符串的模糊比较,在MYSQL中使用'%string%'这样的字段名,在ORACLE中也可以使用'%string%'这样的字段名,但是这种方法不能使用索引,速度不快。使用字符串比较函数instr(fieldname,'string')>0得到更精确的搜索结果。7、空字符的处理MYSQL的非空字段也有空内容,ORACLE中定义的非空字段不允许有空内容。按照MYSQL的NOTNULL定义ORACLE表结构,导入数据时会出错。所以在导入数据的时候,需要对空字符进行判断。如果是NULL或者空字符,需要改成一串空格。Oracle移植到mysql的注意事项客户使用的数据库是mysql,而开发的产品支持oracle,所以一定要将数据库环境从oracle移植到mysql。移植过程中遇到了以下问题。如果我们在最初的设计和编码过程中注意数据库的可移植性,那么在这种情况下不需要额外的工作。一、数据库环境从oracle移植到mysql时遇到的问题1、区分大小写的区别(如果服务器OS是linux)在oracle中一般不区分大小写。有时候我们在使用oracle的时候,不注意大小写。不带双引号的表名和字段名不区分大小写,像这样:insertintotableName和insertintoTABLENAME效果一样,用工具导出创建/数据初始化脚本,得到的结果一般都是表名转成大写和字段名称。但是在MySQL中,所使用的操作系统是否区分大小写决定了数据库名和表名的大小写区分。数据库对应数据目录中的目录,数据库中的每张表至少对应数据库目录中的一个文件(或多个,取决于存储引擎)。因此,使用数据库或表实际上就是在操作这些文件(文件夹),所以操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。在以Linux为内核的操作系统中,区分大小写。解决方法是mysql的数据库名和oracle的大小写保持一致,表名和应用中sql字符串中的表名保持一致。如果应用中的字段名使用了双引号,请将字段名的大小写与双引号中的字符保持一致。如果你的应用引用的表名和字段没有统一的大小写,那你就麻烦大了。2、保留字的区别像sql语言的函数名(如:integer、show)等都是保留字。Oracle中的保留字可以用作表名和字段名,不影响使用,但MySQL中的保留字不能用作表名和字段名,使用会报语法错误。解决办法是用'`'符号把sql语句中的保留字括起来,这个符号位于键盘的tab键上;如果是字段名,还有一个方法是tablename.fieldname。像这样:insertintotablename(id,`interval`)value(…..orinsertintotablename(id,tablename.inteval)value(…..3,自动增长类型的区别oracle有sequence,而inmysql,但是有一个auto_increment属性。解决办法是将Oracle中的sequence转换为使用auto_increment属性。在某些情况下,可能有另一种方法来解决问题。另建一张表记录自增数据。4、数据类型的区别在mysql中,没有oracle中的varchar2和number。mysql有对应的varchar和numeric。当然,oracle中是没有mysql时间类型的。解决方法是更换。5、索引长度限制的区别从MySQL4.1.2开始,MyISAM和InnoDB表的索引长度都支持1000字节,也就是说索引字段的长度不能超过1000字节。如果超过,会报这样的错误:ERROR1071(42000):Specifiedkeywastoolong;最大密钥长度为1000字节。如果是UTF-8编码,相当于333个字符的长度(因为一个UTF8字符占3个字节)。Oracle的索引长度限制比mysql宽松很多。解决方案就不用多说了,要么改索引的定义,要么改字段的定义长度。2、数据库兼容性要注意什么?数据库兼容性应该是数据库设计中应该注意的问题,因为有时候客户有已经在使用的数据库,不想同时维护两个数据库。在这种情况下,更兼容这样的数据库也可以成为产品的卖点。数据库兼容性的关键是遵守标准用法。1、遵循规范的用法,尽量不要使用某些数据库特有的用法,比如msyql的'`'符号的用法。比如很多人都有这种用法。使用oracle创建序列时,在向表中插入数据之前,先SELECTseq.nextvalFROMDUAL;,然后将查询值作为值插入到表中。这种用法不能适应没有顺序的数据库。每个数据库都有一个自动增长的用法。如果你需要使用它,你应该完全使用它。再举个例子,不同的数据库都有扩展分页查询,postgresql有offset和limit,而oracle没有。2、保留字要求数据库设计者不要使用保留字作为表名和字段名。也有很多人有这种用法,在表名和字段名前加'_',像这样:createtable_tablename(_idinteger)。这样就永远不会出现保留字引起的问题。3.避免数据库区分大小写的问题。选择数据库表名和字段名是大写还是小写,在数据库设计和编码过程中完全统一。使用ConvertOracletoMysql工具时,请注意“NameConvertedtoUppercase”选项的控制
