mysql 迁移数据库到 oracle (sql注意问题)

http://ykdn2010.iteye.com/blog/1511349

一. 项目已用到 oracle 函数的转换

1.  Oracle 中的 TO_DATE (),TO_CHAR ()

示例: select * from admadjustmoney t where t.sendtime> to_date(?,‘yyyy-mm-dd      hh24:mi:ss‘) and t.sendtime< to_date(?,‘yyyy-mm-dd hh24:mi:ss‘)

转换后:

SELECT *

FROM `ADMADJUSTMONEY` t

WHERE t.SENDTIME > STR_TO_DATE(sysdate(), ‘%Y-%m-%d %h:%i:%s‘) AND

t.SENDTIME < STR_TO_DATE(sysdate(), ‘%Y-%m-%d %h:%i:%s‘)   注意表名字段名的大小写 MYSQL  大小写敏感    sql 统一大写 hql 统一小写

2.  Oracle 中的 nvl ()

示例 select distinct a.id,a.parentId,a.description,a.name,a.status, NVL(ur.roleid,‘‘)AS roleid from admrole a left join admuserrole ur on (a.id = ur.roleid and ur.userid = ? and ur.status = 1) where a.status = ?

转换后:

select distinct a.id,a.parentId,a.description,a.name,a.status, IFNULL(ur.roleid,‘‘) AS roleid from admrole a left join admuserrole ur on (a.id = ur.roleid and ur.userid = ? and ur.status = 1) where a.status = ?

3.  Oracle 中的 decode ()

示例:

SELECT DECODE(MAX(PIECECODE), NULL, 0, MAX(PIECECODE)) AS PIECECODE FROM PUBPAGEPIECE WHERE 1=1

转换后:

SELECT if(MAX(PIECECODE) IS NULL, 0, MAX(PIECECODE)) AS PIECECODE FROM PUBPAGEPIECE WHERE 1=1

或者用 case when 的标准写法

SELECT

CASE

WHEN MAX(PIECECODE) IS NULL THEN 0

WHEN MAX(PIECECODE) IS NOT NULL THEN MAX(PIECECODE)

END AS PIECECODE

FROM PUBPAGEPIECE WHERE 1=1

4.  Oracle 中的 substr ()

示例: WHERE  t.aid = v.aid and t.province = v.province and t.city = v.city and  t.wid = w.id AND w.startdate>=to_date( substr(?,1,10) ,‘yyyy-MM-dd‘) and w.stopdate<=to_date( substr(?,1,10) ,‘yyyy-MM-dd‘)

转换后:

WHERE  t.aid = v.aid and t.province = v.province and t.city = v.city and  t.wid = w.id AND w.startdate>= STR_TO_DATE substring (?,1,10) ‘%Y-%m-%d‘ )   and w.stopdate<=STR_TO_DATE substring (?,1,10) ‘%Y-%m-%d‘ )

5.  Oracle 中的 trunc ()

示例:

from PUBCOINOPDETAIL where opervirtualCoin > 0 and status = 1 and operTime >= ADD_MONTHS(TRUNC(SYSDATE,‘mm‘) ,-1)  and operTime < TRUNC(SYSDATE,‘mm‘)  group by gene , geneType ,accountId

转换后:

from PUBCOINOPDETAIL where opervirtualCoin > 0 and status = 1 and operTime >=DATE_SUB(date_sub(CURDATE(),INTERVAL EXTRACT(  day from CURDATE())-1 day),INTERVAL 1 MONTH)   上个月第一天 and operTime <DATE_SUB(date_sub(CURDATE(),INTERVAL EXTRACT(day from CURDATE())-1 day),INTERVAL 0 MONTH) [ 这个月第一天 group by gene , geneType ,accountId

 6、Oracle 中的 wm_concat (),NVL()

0:dbms_lob.substr()sql上mysql  clob 转String

o:dbms_lob.substr(wm_concat(NVL(count,0))) count

m:dbms_lob.substr(GROUP_CONCAT(IFNULL(count,0))) count,

7、oracle    

o:is not null,is null

msql :is not null ,is null ,  XX!=‘ ‘

再次提醒 mysql 大小写的问题   sql 统一大写 hql 统一小写 避免不必要的 BUG 出现

二.网络资料附表:oracle 常用函数 与mysql 的对照表 s:mysql o :oracle

1. 绝对值 
   S:select abs(-1) value 
   O:select abs(-1) value from dual

   2. 取整 大 
   S:select ceiling(-1.001) value 
   O:select ceil(-1.001) value from dual

   3. 取整(小) 
   S:select floor(-1.001) value 
   O:select floor(-1.001) value from dual

   4. 取整(截取) 
   S:select cast(-1.002 as int) value 
   O:select trunc(-1.002) value from dual

   5. 四舍五入 
   S:select round(1.23456,4) value 1.23460 
   O:select round(1.23456,4) value from dual 1.2346

   6.e 为底的幂 
   S:select Exp(1) value 2.7182818284590451 
   O:select Exp(1) value from dual 2.71828182

   7. 取 为底的对数 
   S:select log(2.7182818284590451) value 1 
   O:select ln(2.7182818284590451) value from dual; 1

   8. 取 10 为底对数 
   S:select log10(10) value 1 
   O:select log(10,10) value from dual; 1

   9. 取平方 
   S:select SQUARE(4) value 16 
   O:select power(4,2) value from dual 16

   10. 取平方根 
   S:select SQRT(4) value 2 
   O:select SQRT(4) value from dual 2

   11. 求任意数为底的幂 
   S:select power(3,4) value 81 
   O:select power(3,4) value from dual 81

   12. 取随机数 
   S:select rand() value 
   O:select sys.dbms_random.value(0,1) value from dual;

   13. 取符号 
   S:select sign(-8) value -1 
   O:select sign(-8) value from dual -1

   14. 圆周率 
   S:SELECT PI() value 3.1415926535897931 
   O: 不知道

   15.sin,cos,tan 参数都以弧度为单位 
  例如: select sin(PI()/2) value 得到 ( SQLServer 

   16.Asin,Acos,Atan,Atan2 返回弧度

   17. 弧度角度互换 (SQLServer , Oracle 不知道 
   DEGREES :弧度 〉角度 
   RADIANS :角度 〉弧度

数值间比较

   18. 求集合最大值 
   S:select max(value) value from 
   (select 1 value 
   union 
   select -2 value 
   union 
   select 4 value 
   union 
   select 3 value)a

   O:select greatest(1,-2,4,3) value from dual

   19. 求集合最小值 
   S:select min(value) value from 
   (select 1 value 
   union 
   select -2 value 
   union 
   select 4 value 
   union 
   select 3 value)a

   O:select least(1,-2,4,3) value from dual

   20. 如何处理 null 值 (F2 中的 null 以 10 代替 
   S:select F1,IFNull(F2,10) value from Tbl 
   O:select F1,nvl(F2,10) value from Tbl

   21. 求字符序号 
   S:select ascii(‘a‘) value 
   O:select ascii(‘a‘) value from dual

   22. 从序号求字符 
   S:select char(97) value 
   O:select chr(97) value from dual

   23. 连接 
   S:select ‘11‘+‘22‘+‘33‘ value 
   O:select CONCAT(‘11‘,‘22‘)    33 value from dual

23. 子串位置 -- 返回 
   S:select CHARINDEX(‘s‘,‘sdsq‘,2) value 
   O:select INSTR(‘sdsq‘,‘s‘,2) value from dual

   23. 模糊子串的位置 -- 返回 2, 参数去掉中间 则返回 
   S:select patindex(‘%d%q%‘,‘sdsfasdqe‘) value 
   O:oracle 没发现,但是 instr 可以通过第四个参数控制出现次数 
   select INSTR(‘sdsfasdqe‘,‘sd‘,1,2) value from dual 返回 6

   24. 求子串 
   S:select substring(‘abcd‘,2,2) value 
   O:select substr(‘abcd‘,2,2) value from dual

   25. 子串代替 返回 aijklmnef 
   S:SELECT STUFF(‘abcdef‘, 2, 3, ‘ijklmn‘) value 
   O:SELECT Replace(‘abcdef‘, ‘bcd‘, ‘ijklmn‘) value from dual

   26. 子串全部替换 
   S: 没发现 
   O:select Translate(‘fasdbfasegas‘,‘fa‘,‘ 我 ‘ ) value from dual

   27. 长度 
   S:len,datalength 
   O:length 
   28. 大小写转换 lower,upper

   29. 单词首字母大写 
   S: 没发现 
   O:select INITCAP(‘abcd dsaf df‘) value from dual

   30. 左补空格( LPAD 的第一个参数为空格则同 space 函数) 
   S:select space(10)+‘abcd‘ value 
   O:select LPAD(‘abcd‘,14) value from dual

   31. 右补空格( RPAD 的第一个参数为空格则同 space 函数) 
   S:select ‘abcd‘+space(10) value 
   O:select RPAD(‘abcd‘,14) value from dual

   32. 删除空格 
   S:ltrim,rtrim 
   O:ltrim,rtrim,trim

   33. 重复字符串 
   S:select REPLICATE(‘abcd‘,2) value 
   O: 没发现

   34. 发音相似性比较 这两个单词返回值一样,发音相同 
   S:SELECT SOUNDEX (‘Smith‘), SOUNDEX (‘Smythe‘) 
   O:SELECT SOUNDEX (‘Smith‘), SOUNDEX (‘Smythe‘) from dual 
   SQLServer 中用 SELECT DIFFERENCE(‘Smithers‘, ‘Smythers‘) 比较 soundex 的差 
  返回 0-4 , 为同音, 最高

日期函数 
   35. 系统时间 
   S:select getdate() value 
   O:select sysdate value from dual

   36. 前后几日 
  直接与整数相加减

   37. 求日期 
   S:select convert(char(10),getdate(),20) value 
   O:select trunc(sysdate) value from dual 
   select to_char(sysdate,‘yyyy-mm-dd‘) value from dual

   38. 求时间 
   S:select convert(char(8),getdate(),108) value 
   O:select to_char(sysdate,‘hh24:mm:ss‘) value from dual

39. 取日期时间的其他部分 
   S:DATEPART 和 DATENAME 函数 (第一个参数决定) 
   O:to_char 函数 第二个参数决定

  参数 --------------------------------- 下表需要补充 
   year yy, yyyy 
   quarter qq, q ( 季度 
   month mm, m (m O 无效 
   dayofyear dy, y (O 表星期 
   day dd, d (d O 无效 
   week wk, ww (wk O 无效 
   weekday dw (O 不清楚 
   Hour hh,hh12,hh24 (hh12,hh24 S 无效 
   minute mi, n (n O 无效 
   second ss, s (s O 无效 
   millisecond ms (O 无效 
   ----------------------------------------------

   40. 当月最后一天 
   S: 不知道 
   O:select LAST_DAY(sysdate) value from dual

   41. 本星期的某一天(比如星期日) 
   S: 不知道 
   O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

   42. 字符串转时间 
   S: 可以直接转或者 select cast(‘2004-09-08‘as datetime) value 
   O:SELECT To_date(‘2004-01-05 22:09:38‘,‘yyyy-mm-dd hh24-mi-ss‘) vaule FROM DUAL;

   43. 求两日期某一部分的差(比如秒) 
   S:select datediff(ss,getdate(),getdate()+12.3) value 
   O: 直接用两个日期相减(比如 d1-d2=12.3 ) 
   SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

   44. 根据差值求新的日期(比如分钟) 
   S:select dateadd(mi,8,getdate()) value 
   O:SELECT sysdate+8/60/24 vaule FROM DUAL;

   45. 求不同时区时间 
   S: 不知道 
   O:SELECT New_time(sysdate,‘ydt‘,‘gmt‘ ) vaule FROM DUAL;

   ----- 时区参数 北京在东 区应该是 Ydt------- 
   AST ADT 大西洋标准时间 
   BST BDT 白令海标准时间 
   CST CDT 中部标准时间 
   EST EDT 东部标准时间 
   GMT 格林尼治标准时间 
   HST HDT 阿拉斯加 夏威夷标准时间 
   MST MDT 山区标准时间 
   NST 纽芬兰标准时间 
   PST PDT 太平洋标准时间 
   YST YDT YUKON 标准时间

移至常见问题

一、数据库环境从oracle 转向mysql 碰到的问题。

  因为逻辑不变,所以原则是不改应用程序代码,只改数据库表的创建/ 初始化sql 。下面是我们碰到的问题以及解决办法。

  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 、数据类型的区别。

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

  解决办法是替换。

  4 、自动增长类型的区别。

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

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

  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 、 避免数据库大小写敏感的问题。

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

  3 、 保留字。

  要求数据库设计者尽量不使用保留字作表名和字段名。也有很多人有这种用法,在表名和字段名前加‘_’ ,像这样:create table _tablename ( _id integer) 。这样永远不会出现保留字引起的问题

时间: 2024-11-04 23:26:19

mysql 迁移数据库到 oracle (sql注意问题)的相关文章

mysql优化-数据库优化、SQL优化

我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) DEFAULT NULL, `age` int(3) DEFAULT NULL, `money` double(8,2) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, `create_date` datetime(3) DEFAULT NULL

使用MYSQL命令直接导入导出SQL文件(转)

参考:http://blog.csdn.net/jiary5201314/article/details/52026816 1.MYSQL中将数据库导出成SQL文件 其实很简单的,就是一条语句就可以了,首先我们打开cmd,不用进mysql指令界面,直接按照下列格式将导出语句敲进去,然后再输入密码即可了: mysqldump -h[主机所在IP] -u[用户名] -p [要导出的数据库]>[导出的路径//[文件名].sql] 好吧,直接这样看可能有点抽象,我们来举个例子,目前我的MYSQL中有一个

使用Oracle SQL Developer迁移MySQL至Oracle数据库

Oracle SQL Developer是Oracle官方出品的数据库管理工具.本文使用Oracle SQL Developer执行从MySQL迁移至Oracle数据库的操作. 2017年3月6日 操作步骤: 1.在Oracle数据库中创建移植资料档案库用户 资料档案库用户不是用来接收MySQL迁移数据的用户,而是进行数据迁移配置的用户. Oracle创建用户命令如下: create user migrater identified by migrater; alter user migrate

数据库 SQL Server 到 MySQL 迁移方法总结

最近接手一起老项目数据库 SQL Server 到 MySQL 的迁移.因此迁移前进行了一些调查和总结.下面是一些 SQL Server 到 MySQL 的迁移方法. 1. 使用 SQLyog 迁移 具体方法可以参加:http://www.cnblogs.com/gaizai/p/3237907.html 优点:该迁移方法很简单,灵活,迁移时,可以进行字段的修改,比如在sql server中原来是datetime,然后迁移到mysql时你可以配置成timestamp: 成功率很高: 缺点:迁移很

数据库迁移之从oracle 到 MySQL

方式一: 手动方式导入导出 手动的方式导入, 就是操作步骤会比较繁琐一些. 对Table 的结构和数据: 1. 使用 SQL Developer 把 oracle 的 table 的schema 和 Data(.sql 和 .xls) 导出 2. 使用 MySQL 的 WorkBench 创建 Table 和导入数据. 这里语法上会稍微有一些不同, 所以需要略微做一些调整. 对于View 来说, 特别是复杂的有子查询的Oracle View 说, 要导入到MySQL 看起来就不是那么容易了. 方

MySQL 迁移 Oracle 工具SQL Developer

业务需求,需要将MySQL数据库内容迁移至Oracle数据库中,数据量在300g左右,为了方便,通过Oracle自己的工具SQLDeveloper迁移,步骤如下: 下载mysql-connector-java-5.1.24驱动,存放在C:\sqldeveloper\jlib目录下 配置mysql-connector第三方驱动 链接MySQL及Oracle数据库 创建MySQL移植资料库 创建ORACLE migration user create user migrater identified

数据库迁移之从oracle 到 MySQL最简单的方法

数据库迁移之从oracle 到 MySQL最简单的方法 因工作需要将oracle数据库换到MySQL数据库,数据量比较大,百万级别的数据,表也比较多,有没有一种既快捷又安全的方法呢?答案是肯定的,下面介绍一个工具,非常的好用 需要的工具:Navicat Premium  Navicat Premium 原本是收费的,但是网上也有很多绿色版(盗版)的,本人亲测,也挺好用的,土豪可以忽略这句话. 第一步: 安装Navicat Premium,打开软件,建立数据库的链接,一个是原oracle数据库的链

使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip * @param port * @param databaseName * @return*/ public static String getTestDbUrl(int dbType, String ip, String port, String databaseName){ String ur

介绍几种大型的Oracle/SQL Server数据库免费版

介绍几种大型的Oracle/SQL Server数据库免费版 我们知道,Oracle和SQL Server等大型数据库也都存在一些免费的版本,这些免费的版本已经能够满足许多中小项目的需求.对于在校大学生来说,从学习的目标上来讲,安装免费版的大型数据库也就足够用了,而且还不会花费个人计算机过多的资源,可谓一举两得.本文我们介绍了几种免费的大型数据库,接下来我们就开始介绍. 一.Oracle Database 10g Express Edition 简称Oracle 10g迅捷版(XE版),是一款基