mysql与oracle在sql层面的差异

mysql与oracle在sql层面的差异

问题: A项目以前是基于mysql开发的.现在做的B项目是基于A项目的整体框架,但是需要数据库变为oracle. 在使用的过程中总结的部分差异.第一次使用oracle,总结到的只是自己遇到的,很不全面,欢迎各位大牛补充说明,不对的地方欢迎指正.

`

  1. 修改字段类型时提示: ORA-22859: 无效的列修改
    大字段,类型不能随意修改.比如BLOB.如果改动就必须删除列保存之后,再重新建立,因此对于大字段要格外注意!
  2. 使用union all的时候,mysql中字段数量可以不一致,但是oracle中字段必须完全保持一致;
  3. oracle中是支持CONCAT函数的,可以用此函数来拼接字符串,但是要注意的是oracle中的CONCAT函数只有两个参数,所以如果多次拼接应该写为: select * from tab1 t where t.col1 like concat(concat(’%’,‘a’),’%’); 而不能像mysql中写的那个concat(’%’,‘a’,’%’)这样! 或者使用||也是可以的: like ‘%’ || ‘a’ || ‘%’
  4. 报: ORA-01861: 文字与格式字符串不匹配
    sql中的字符串转为日期
    oracle —> to_date
    mysql —> date_format
    时间处理的时候格式也不一致,mysql中是认可%Y-%m-%d的,但是在oracle中需要规范yyyy-mm-dd
    与时间做对比的时候,不能是时间和字符串做比较,也得同样处理为时间. 比如: select a.id from table a where 1=1 and to_date ( a.create_date, ‘yyyy-mm-dd’ ) <= to_date(‘2020-11-20’,‘yyyy-mm-dd’)
    在时间对比的时候,如果要取时间的年月日,但是实际字符串为年月日时分秒,不能直接入上述取,需截取,例如: to_date (substr(sa.sign_in_date,1,10), ‘yyyy-mm-dd’ )
  5. 报错 ORA-00979: 不是 GROUP BY 表达式
    在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中. 即 select中的字段不可以单独出现,必须出现在group语句中或者在组函数中
    关于分组,可以参考: https://blog.csdn.net/basenet855x/article/details/6694150
  6. 查询信息使用到递归,比如查询职位以及职位下级的时候.
    SELECT * FROM POSITION START WITH ID = #{id} CONNECT BY PRIOR ID = PARENT_ID;
    oracle中是支持递归查询的,不像mysql内,这样查询需要将一张表看做两张查询.
  7. 在union all的时候,两个表的字段类型等必须完全一致,如果union all的时候没有字段用’'代替,会报ORA-12704: 字符集不匹配.此时最简单的方法就是处理已查询字段.通过to_char()即可.
  8. 在表中插入字段时差异:
    ORACLE中:
    alter table TABLE_A add test_a varchar2(11);
    COMMENT ON COLUMN TABLE_A .test_a IS ‘测试字段 1’;
    MYSQL中:
    ALTER TABLE TABLE_A ADD test_a varchar(32) DEFAULT null COMMENT “测试字段 1”;
    `

持续补充中… …

猜你喜欢

转载自blog.csdn.net/weixin_44974020/article/details/109853010