背景介绍
项目代码在多个环境运行,其中一个环境有问题。一直报错sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (3065, "Expression #2 of ORDER BY clause is not in SELECT list, references column 'xxx' which is not in SELECT list; this is incompatible with DISTINCT")百思不得其解,一样的代码,怎么会这样?
问题定位思路及步骤
把有问题的sql放到其他没有报错的数据库服务器上对比运行
结果能够正常查询结果。引发思考,同样的MySQL,版本都一样,怎么会这样?最后查到可能是sql_mode不一样导致的问题。
查看sql_mode
show variables like '%sql_mode%';
正常的数据库结果
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
异常的数据库结果
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
扩展
sql_mode是什么
sql_mode是一组语法校验规则
mysql有哪些sql_mode
MySQL8.0总共有10个sql_mode,其中6个是默认的,4个自定义配置
mysql8默认的6个mode配置
- ONLY_FULL_GROUP_BY:- GROUP BY的列必须在- select中,- select中可以有额外的聚合函数操作
- STRICT_TRANS_TABLES
- NO_ZERO_IN_DATE
- NO_ZERO_DATE
- ERROR_FOR_DIVISION_BY_ZERO
- NO_ENGINE_SUBSTITUTION
mysql8默认的4个自定义配置
- NO_AUTO_VALUE_ON_ZERO
- NO_AUTO_CREATE_USER
- PIPES_AS_CONCAT
- ANSI_QUOTES
总结
遇到sql在不同服务器数据库上运行有的报错,有的不报错,就可以考虑是不是sql_mode问题了