背景: 某个老的服务,之前是在sql_mode非严格模式下开发的,group by写法是非标的。 

最近要迁移了,DBA这边分配的数据库是高版本的,并且设置了global级别的严格的sql_mode(only_full_group_by等等参数)。


这样的话, 服务运行过程中遇到group by非标写法就直接报错了。那么,我们有下面几种解决方法:

1、改代码。 老系统基本没啥人在维护和使用了,新接手的开发人员改起来需要点时间,需要考虑投入和产出的性价比。

2、改数据库的sql_mode。但是这个数据库并不是一个服务独享的,如果暴力的改了数据库级别的sql_mode,担心影响到其它服务的运行结果。

3、改会话级别的sql_mode,只对当前服务生效,不影响连接该数据库上的其它服务


显而易见,方法3是最稳妥最简便的。

java连接串的写法也很简单,如下demo:

jdbc:mysql://192.168.11.111/sbtest?sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'


通常,我们看到jdbc连接串的示例中还会设置的有: 1、时区 2、字符集 ,这里我们没写上去,大家自己实际测试下如何拼接吧。

实际上还有很多的可配置项(例如 连接超时、查询超时、开启压缩、开启profilesql、自动explainSlowQueries),具体可以看下面的官方文档。


官方文档: 

​https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-jdbc-url-format.html​

​https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-session.html​