oracle和mysql双数据库兼容总结

本文探讨了在Oracle和MySQL数据库间实现SQL语句兼容性的关键差异与解决方案,包括函数使用、表别名、字符串处理、类型转换、CASE语句、DISTINCT使用限制及主键自增策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sql最好不要用函数

oracle的表别名不能用as,mysql都可以

oracle只能用单引号,mysql都可以

oracle在mapper中不能写分号

oracle的concat只能连接两个字符,mysql可以连接三个

//通用写法
LOGIN_NO like CONCAT('%',CONCAT(#{loginNo},'%'))

oracle数字和字符串不能直接比较,需要转换,mysql可以直接比较

//oracle   to_char
LEFT JOIN ps_objectinfo_dict b 
    ON to_char( a.app_id ) = b.obj_val
//oracle和mysql都可以用   CAST
LEFT JOIN ps_objectinfo_dict b 
    ON CAST( a.app_id AS NVARCHAR2 ( 20 ) ) = b.obj_val

oracle的casewhen语句对字符集严格匹配,mysql随便

正常是下面这样的,在mysql可以,但oracle不可以,因为STATE的类型和单引号中的数据类型不一致,会报错:ORA-12704:字符集不匹配。

CASE STATE 
    	WHEN 'T' THEN
    	'待处理' 
    	WHEN 'H' THEN
    '已处理' 
END

可以使用to_char 或者cast 进行转换,但为了更好的数据库兼容性,选择以下方法:

CASE 
    	WHEN STATE = 'T' THEN
    	'待处理' 
    	WHEN STATE = 'H' THEN
    	'已处理' 
END

oracle中的DISTINCT在clob字段长度超过2000时会报错

ORA-00932: inconsistent datatypes: expected - got NCLOB

可能是oracle 11g的bug,在字段长度超过2000时,去重复查询中出现上面的问题

解决:升级oralce;重新优化表结构和字段;优化sql语句,最好避免使用DISTINCT;

 

oracle数据库需配置JdbcType.NULL, 默认是Other

描述:

springboot 项目mybatis plus 需要设置 jdbcTypeForNull属性,否则为null的值默认插入的值是Other

比如:使用updateById()方法,传入的实体对象有null值,这时oracle的话就会报错,因为sql的参数匹配不正确。

解决:

方法1:

application.yml

mybatis-plus:
  configuration:
    jdbc-type-for-null: 'null' #注意:单引号

方法2:

查看mp-starter-源码, MybatisPlusAutoConfiguration, 可以发现,第119行有一个configurationCustomizers,可以修改configuration

自定义一个,配上就完工

@Bean
public ConfigurationCustomizer configurationCustomizer(){
    return new MybatisPlusCustomizers();
}

class MybatisPlusCustomizers implements ConfigurationCustomizer {

    @Override
    public void customize(org.apache.ibatis.session.Configuration configuration) {
        configuration.setJdbcTypeForNull(JdbcType.NULL);
    }

方法3:

第一步:把 可更新为空的 javabean 属性前加上注解:

@TableField(el = "username, jdbcType=VARCHAR")

@Email

@TableField(el = "email, jdbcType=VARCHAR")

private String email;

第二步: 使用updateAllColumnById方法,而不是updateById. 如:

this.baseMapper.updateAllColumnById(user);

主键自增策略

#mybatis
mybatis-plus:
    global-config:
        #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
        id-type: 2 #oracle兼容

针对大字段 text/clob插入和查询

建议在mybatis中增加标识当前数据库版本的变量DB_TYPE,拼接出不同的查询和插入sql脚本。

public static final String DB_TYPE = "MYSQL";///ORACLE

数据传输、建表

可以使用navicat的数据传输功能,少量数据还可以,大量不太行。

Tools->Data Transfer

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值