基于MySQL项目适配达梦数据库工具

本文介绍了如何使用Druid工具将MySQL项目适配到达梦数据库,包括SQL语法调整、函数转换和特定功能的替代方法,如GROUP_CONCAT到LISTAGG、IF到CASEWHEN等。
摘要由CSDN通过智能技术生成

基于MySQL项目适配达梦数据库工具

这是个人根据公司达梦适配改造经验封装的一个starter

原理

基于Druid里提供的AST工具和Filter实现。在数据库连接层拦截, 上层无感知, 可以用mybatis、jpa甚至jdbcTemplate都可以拦截到。
Druid提供的AST开发简单、灵活、并且性能达到生产级别。

项目地址

Gitee

已支持的功能

`替换为"

说明

  • MySQL用`包裹关键字,而达梦中用的是"
  • MySQL和达梦关键字集并不一样,遇到的时候加上`即可
  • 目前支持
  1. 数据库名、表名和列名
  2. 表别名和列别名
  3. 属性名, 形如 tab1.col1、schema1.tab1, col1、tab1即属性名

GROUP_CONCAT转LISTAGG

说明

仅支持一个参数的情况, 例如GROUP_CONCAT(col1, col2)是不支持的, 但是可以修改sql改成GROUP_CONCAT(CONCAT(col1, ‘_’, col2))

IF转CASE WHEN

** 说明

达梦IF中类型校验严格, 需要转换写法

CONVERT转CAST

说明

达梦不支持前者

json_unquote转TRIM

说明

达梦不支持前者

st_contains转dmgeo.ST_CONTAINS

说明

达梦不支持前者

st_distance_sphere转dmgeo.ST_Distance

说明

达梦不支持前者

POINT转dmgeo.ST_GeomFromText(CONCAT(‘POINT(’,arg0,arg1,)'))

说明

达梦不支持前者

geometry_from_text转dmgeo.ST_GeomFromText

说明

达梦不支持前者

boolean转0/1

说明

达梦类型校验严格, 并且不支持boolean类型

除法分母为0校验

说明

需要在数据库中添加函数

CREATE FUNCTION FUNC_OP_MY_DIVIDE( C1 IN NUMBER,
                                   C2 IN NUMBER )
    RETURN NUMBER AS
    BEGIN
        RETURN
        CASE
        WHEN C1 is null then
            null
        when C2 is null or C2 = 0 then
            null
        else
            C1/C2
        END;
    END;
/

bit/int等去除长度

说明

DDL

JSON操作符->替换为JSON_EXTRACT

说明

JSON操作符->>替换为JSON_VALUE

说明

b’0/1’替换为’0/1’

说明

INTERVAL expr unit中expr转字符

说明

expr若是非数字或字符串等特殊表达式, 将会得到错误的形式

date_format格式处理

说明

已知不支持的功能

is [not] val[非null]

说明

例如 col1 is false、col1 is not 0

str_to_date函数

说明

代码中去掉,由数据库自动转换

case when中条件表达式作为where条件或者if条件或者select列等

说明

不支持的写法

  • where case when t>0 then a>0 else b>0 end
  • if(case when t>0 then a>0 else b>0 end,1,0)
  • select case when t>0 then a>0 else b>0 end

换写法

例如 where case when t>0 then a>0 else b>0 end可以改成where case when t>0 then a else b end >0
或者改成where ((t>0 and a>0) or b>0)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值