不同的环境,相同的sql_mode设置,相同的SQL,一个执行成功,一个执行失败!

【TiDB 使用环境】生产环境/测试
sql_mode是相同的,都是

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

执行以下sql,测试环境正常,生产环境报错

select it.id, it.name, it.brand, it.start_time, it.end_time, it.status, count(ip.id) as totalPeopleNum
        from invitation it
        left join invitation_role ir on it.id = ir.invitation_id and ir.is_delete = 0
        left join invitation_people ip on ir.id = ip.role_id and ip.is_delete = 0
        where
            it.is_delete = 0
        group by it.id
        order by it.create_time desc

SQL 错误 [1055] [42000]: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘auto_show.it.brand’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
我把生产和测试的所有配置都导出来对比了一下,配置没啥区别

修改的是全局的,还是会话的?

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

全局。不管哪个环境这个sql_mode配置都没改过。讲道理来说测试也要报错才是,但在测试没有报错

全局的应该对当前连接不生效。 把会话的也改了试试。

不管哪个环境,不管是global还是session,sql_mode都是默认的ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

:thinking:那会不会是数据库链接里设置了sql_mode?按说不应该出现sql表现和sql_mode不一致的情况。

之前好像就有碰到过类似的case,程序链接里面有单独设置不同的sql_MODE

应该不是程序链接的设置。我用的dbeaver,sql复制出来通过工具直接执行的

你的sql_mode带ONLY_FULL_GROUP_BY,你的sql肯定报错的,你把sql_mode里面的ONLY_FULL_GROUP_BY去了

不要用数据库连接工具来对比,用命令行连接数据库来,有些客户端会有很多额外的设置,命令行相比之下更干净

it.id 以及 ip.role_id 这两个表的两个字段测试环境和生产环境是主键索引吗?

client端全部设置全局试下 理论上不会的