Oracle到mysql转换的问题总结
常用字段类型区别
oracle number(10,0) number(10,2) varchar2 date Colb mysql int decimal(10,2) varchar datetime text 个别语句写法区别
1.oracle里只可以用单引号包起字符串,mysql里可以用双引号和单引号。 2.mysql 在select * from () ....,from后面是一个结果集时,括号后面必须加上别名。
3.mysql在delete数据时不能给表加别名,如:delete from table1 T where....,会报错,但是可以这样写:delete T from table1 T where....。
4.Mysql不支持在同一个表中先查这个表在更新这个表,举个例子说明一下, insert into table1 values(字段1,(select 字段2 from table1 where...)), 但是可以在后面那个table1加上别名就没有问题了。 insert into table1 values(字段1,(select T.字段2 from table1 T where...)) 5.MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。也可以自定义函数实现oracle的nextval。
6.翻页的sql语句处理,MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数,例如:select * from table limit m,n,意思是从m+1开始取n条。
常见的函数替换
1.日期转换方面的函数 oracle mysql 说明 to_char(date,’yyyy-MM-dd hh24:mi:ss’) to_date(str,’yyyy-MM-dd hh24:mi:ss’) to_date(str,’yyyy-MM-dd hh24:mi:ss’) to_char()、to_number() date + n date_format(date,'%Y-%m-%d %H:%i:%s') str_to_date(str,'%Y-%m-%d %H:%i:%s') str_to_date(str,'%Y-%m-%d%T') convert(字段名,类型) date_add(date,interval n day) 注意时间格式的对应 注意时间格式 注意时间格式 类型转换 日期增加n天 select date_add(sysdate(),INTERVAL 2 DAY); 日期增加n个月 select date_add(sysdate(),INTERVAL 2 MONTH); 日期相减获取天数 add_months(date,n) date_add(date,interval n month) datediff(date1,date2) 2.oracle中decode()函数,可以用case when进行替换 例子:
Oracle:select decode(a,b,c,d) as col1 from table1; Mysql:select
case
when a=b then c when a!=b then d end as col1 from table1
3.oracle的函数 ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2),根据col1分组,在分组内根据col2排序,改函数计算的值就表示每组内部排序后的顺序编号。
Mysql没有这个函数,可以用mysql的用户变量来实现 例子:
Oracle:select row_number() over(partition by col1 order by col2) as num from table1 Mysql:select num1 as num from (select if(@pdept=col1,@rank:=@rank+1,@rank:=1) as num1,@pdept:=col1 from table1 order by col2 ) H 这里用到mysql的用户变量。
4.oracle的行号ROWNUM,mysql没有这个行号,也需要用用户变量来实现。 例子:
Oracle:select * from table1 where rownum - col1=0
Mysql: select * from table1,(SELECT (@rowNum := 0)) HH where (@rowNum := @rowNum + 1) - col1=0
5.Oracle 中的 substr (hello,a,b) mysql中是substring(hello,a,b) oracle的a=0和a=1是一样的,都是从第一个开始。Mysql是从0开始。
date1 - date2 6.Oracle的nvl()对应mysql的ifnull()。 7.Oracle 中的(),列转行函数,以逗号隔开,mysql可以用GROUP_CONCAT()进行替换。
8.Oracle的||可以用mysql的+替代,但是mysql在往某列加上字符时应该用concat, 例如给表中name字段加上x:update table1 set name=concat(x,name)。
移植过程中重点问题 数据类型差异
ORACLE数据库和MYSQL数据库在数据类型方面差异比较大,而且数据类型也是一个数据库存储数据的基础,所以找到数据类型之间的对应是整个系统进行移植的基础。以下给出了ORACLE à MYSQL数据类型的对应关系。
数值类型:
NUMBER à DECIMAL,精度刻度都不变
注:如果是序列用BIGINT
字符串类型:
VARCHAR2 à VARCHAR长度不变。 LONG à LONGTEXT
这里有可能遇到的问题是超过主键key长度的问题,根据实际情况适当修改,如果是TEXT类型也需要指名长度,否则建立key会报错
日期类型:
DATE à DATETIME
TIMESTAMP(N) à TIMESTAMP
SQL语法差异
SEQUENCE:
MYSQL没有ORACLE中的SEQUENCE对象,我们在迁移的时候需要特别注意,一般SEQUENCE有两种用途:
1、 作为表中自增字段的序列号。 2、 程序中获得自动编号。
MYSQL数据类型中存在 AUTO_INCREMENT为自增数据类型。我们可以利用该数据类型变通一下来满足我们现有系统中的SEQUENCE功能。
1、 对于ORACLE中SEQUENCE作为表的自增列一般是通过与触发器绑定实现的,在MYSQL中我们可以直接利用MYSQL的AUTO_INCREMENT类型来实现。
2、 ORACLE开发的应用程序中直接SELECT SEQUENCT来获得自动编号,对于这个功能我们也可以利用MYSQL的AUTO_INCREMENT类型来实现。
首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值:
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+
| 3 | +------------------+ 1 row in set sec)
我们可以创建一个含有自增列的表,对该表进行INSERT操作后,再利用
LAST_INSERT_ID()函数来获得刚刚INSERT的值,也就是相当于ORACLE中的SEQUENCE. NETVAL。也就是INSERT操作+SELECT操作获得一个自动编号。
mysql> CREATE TABLE MOCHA_BE_SEQUENCE(ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREM
ENT);
Query OK, 0 rows affected sec)
mysql> INSERT INTO MOCHA_BE_SEQUENCE Query OK, 1 row affected sec)
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+
| 1 | +------------------+ 1 row in set sec)
mysql> INSERT INTO MOCHA_BE_SEQUENCE Query OK, 1 row affected sec)
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() |
VALUES(NULL); VALUES(NULL);