MySQL、Oracle适配及其注意事项

139 阅读2分钟

SQL语法不同之处 保证SQL在各个数据库可用

  • Oracle执行sql返回字段名称默认是大写,写sql时字段统一成大写
  • select后字段数据判断用case when
  • Oracle:NVL(dr,0) MySQL IFNULL(dr,0) 写sql避免写这种
  • Oracle:start with 通过父级id查询所有的下级及本级数据,这种情况下表结构增加inner_code字段,记录每一级信息,通过like去查询。树形表结构设计需要是否末级节点、层级字段。
  • 注意视图中用的语法是否都可用
  • 创建分区表不同,程序中去判断配置文件数据库类型去执行不同的sql。
    //带子分区
    Mysql:alter table tablename add partition(partiton P20200101 values in (('date','sch')))
    Oracle:sql可百度  需要注意的是需要先判断主分区是否已创建,再去在主分区的基础上创建子分区,而且创建主分区时不加子分区而导致直接创建的默认分区会导致增加子分区报错。
    
  • MySQL区分""与NULL,Oracle不区分,用 IS NULL判断,MySQL一般要把NULL与""看成一类,一起过滤掉。处理方式:IS NULL OR == ''
  • purge原用法: drop table purge处理方法:mysql 直接删掉purge关键字
  • Oracel特有关键字 || 用concat代替,分页用到rownum,根据不同数据源去判断,to_char\to_date
  • Oracle特有表 USER_TABLES USER_TAB_PARTITIONS USER_TAB_SUBPARTITIONS USER_TAB_COLUMNS
    USER_COL_COMMENTS
    USER_CONSTRAINTS
  • MySQL 多表查询每张表要有别名 delete不加别名
  • substr有区别,统一从1开始,substr(1,length)
  • 这种写法Integer cou = dao.queryForObject(sql.toString(), new ColumnProcessor()); Integer替换为Number,这个是数据库表转换时后台字段有可能不是int类型,返回可能是double

sql优化

待补充

mybatis注意点

  • 用分页插件时,xml里sql用到distinct要再封装一层,底层计算总数时会把sql修改select count(1)
  • xml标签 使用list!='' 会导致遍历集合失败,因为他会强制转换数据类型,使用list.size > 0,这也是使用不当。if判等,基础类型用= 字符串类型用==,单字符的话,写成test='item=="a"'