兼容多套数据库的sql最佳实践
sql兼容多套数据库
场景:由于我们后端需要兼容多套数据库,如MySQL、金仓、达梦等数据库,在编写sql的时候,需要统一规范
-
like语法使用单引号,如,
like '%有线%'
-
不允许使用数据库关键字作为表字段,常见关键字:
-
order
-
admin
-
domain
-
current
解决方案:开发过程中,各大数据库关键字不统一且繁多,难免会用到意想不到的关键字,所以字段统一加上公司名称前缀,xw_order、xw_admin
-
-
查询字段不允许双引号、单引号包裹,如,
SELECT vc_direct AS `direct` SELECT vc_direct AS 'direct'
-
禁止使用date_sub函数
date_sub(date,INTERVAL expr type)
达梦数据库中,expr 需要加单引号
如:date_sub(now(),interval '6' month)
金仓数据库需要换成
ADD_MONTHS(SYSDATE,-6)
-
不推荐使用
if
函数否则必须做兼容,如:if(?3 is not null, direct = ?3, 1 = 1)),需要转换成
if(?3 is not null, if(direct = ?3, 1, 0), 1)
-
建表字段不允许驼峰,需要隔开使用下划线_
-
不允许使用CONVERT(‘中文’ USING utf8mb4) COLLATE utf8mb4_general_ci,utf8mb4只有mysql有
-
不推荐使用
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不能出现等号=
-
数据库时间字段类型一律使用datetime,禁用timestamp、time、varchar;
代码层面推荐使用LocalDateTime,做为时间字段的接收或者传入类型
-
总结
-
不要使用某个数据库独有的函数(可以永远不要用函数,可以代码层面处理的就不在数据库里处理)
-
不使用数据库关键字做字段
-
不在sql层面做逻辑判断
-
时间类型要用对,加减时间在代码层面处理
-
更多推荐
所有评论(0)