兼容多套数据库的sql最佳实践

场景:由于我们后端需要兼容多套数据库,如MySQL、金仓、达梦等数据库,在编写sql的时候,需要统一规范

  1. like语法使用单引号,如,like '%有线%'

  2. 不允许使用数据库关键字作为表字段,常见关键字:

    • order

    • admin

    • domain

    • current

    解决方案:开发过程中,各大数据库关键字不统一且繁多,难免会用到意想不到的关键字,所以字段统一加上公司名称前缀,xw_order、xw_admin

  3. 查询字段不允许双引号、单引号包裹,如,

    SELECT vc_direct AS `direct`
    
    SELECT vc_direct AS 'direct'
    
  4. 禁止使用date_sub函数

    date_sub(date,INTERVAL expr type)

    达梦数据库中,expr 需要加单引号
    如:date_sub(now(),interval '6' month)

    金仓数据库需要换成 ADD_MONTHS(SYSDATE,-6)

  5. 不推荐使用if函数

    否则必须做兼容,如:if(?3 is not null, direct = ?3, 1 = 1)),需要转换成if(?3 is not null, if(direct = ?3, 1, 0), 1)

  6. 建表字段不允许驼峰,需要隔开使用下划线_

  7. 不允许使用CONVERT(‘中文’ USING utf8mb4) COLLATE utf8mb4_general_ci,utf8mb4只有mysql有

  8. 不推荐使用case when函数

    反例sql

    SELECT *
    FROM s_sg_area s
    WHERE
        case
        when true
        then s.area_code = '440111015004'
        else s.area_type = '03'
        end
    

    一定要使用的话,then和else不能出现等号=

  9. 数据库时间字段类型一律使用datetime,禁用timestamp、time、varchar;

    代码层面推荐使用LocalDateTime,做为时间字段的接收或者传入类型

  10. 总结

    • 不要使用某个数据库独有的函数(可以永远不要用函数,可以代码层面处理的就不在数据库里处理)

    • 不使用数据库关键字做字段

    • 不在sql层面做逻辑判断

    • 时间类型要用对,加减时间在代码层面处理

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木一番

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值