집 >데이터 베이스 >MySQL 튜토리얼 >MySQL 설정 only_full_group_by의 오류 보고 문제를 자세히 설명하는 기사
개발 환경은 mysql5.6
에 연결되어 있고, 테스트 환경은 mysql5.7
에 연결되어 있습니다. 개발 중에 친구가 group by
에 대한 sql
문을 작성했습니다. 개발 환경에서는 정상적으로 실행되지만, 테스트 환경에서는 예외가 발견됩니다. mysql5.6
,而测试环境是 mysql5.7
。开发中有小伙伴写了有关 group by
的 sql
语句。在开发环境中运行是正常的,而到了测试环境中就发现了异常。
原因分析:MySQL5.7
版本默认设置了 mysql sql_mode = only_full_group_by
属性,导致报错。
其中 ONLY_FULL_GROUP_BY
就是造成这个错误的罪魁祸首了,在这种严格模式下,对于 group by
聚合操作,若在 select
中的列没有在group by
中出现,那么这个 SQL
就是不合法的。因为开发写的 sql
中,select
列不在 group by
从句中,在使用 group by
时就会报错。
测试环境下载安装的是最新版的 mysql5.7.x
版本,默认是开启了 only_full_group_by
模式的。
1. 查看 sql_mode
SELECT` `@@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
2. 去掉ONLY_FULL_GROUP_BY,重新设置值。
SET` `@@``global``.sql_mode =``'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'``;
3. 上面是改变了全局sql_mode,对于新建的数据库有效。
对于已存在的数据库,则需要在对应的数据下执行
SET` `sql_mode =``'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'``;
以上方法mysql数据库重启后依然无效,下列方式重启后依然生效
找到 MySQL
的配置文件,在 linux
系统上 /etc/my.cnf
文件,查询 sql_mode
字段,我并没有在配置文件中找到这个关键字,所以我手动添加进去:
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
需要注意的一点是一定要添加在 [mysqld]
配置内,这样添加完后重启mysql
才会生效,退出数据库:exit,重启命令:
service mysqld restart #lnmp重启mysql lnmp restart mysql
刷新页面报错信息消失成功解决,再次连接上数据库查看 sql_mode
配置 select @@sql_mode
:
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
到此这篇关于 Mysql5.7
及以上版本 ONLY_FULL_GROUP_BY
报错的解决方法的文章就介绍到这了,更多相关 Mysql5.7 ONLY_FULL_GROUP_BY
원인 분석: MySQL5.7
버전에는 기본적으로 mysql sql_mode = only_full_group_by
속성이 설정되어 있어 오류가 발생합니다.
ONLY_FULL_GROUP_BY
가 이 엄격 모드에서 group by
집계 작업에 대해 select
에 있는 경우입니다. 의 열이 group by
에 나타나지 않으면 이 SQL
은 불법입니다. 개발자가 작성한 sql
에는 group by
를 사용할 때 group by
절에 select
열이 없기 때문입니다. 코드> 오류를 보고합니다. 테스트 환경은 최신 버전의 mysql5.7.x
를 다운로드하여 설치했습니다. only_full_group_by
모드가 기본적으로 활성화되어 있습니다.
1. sql_mode를 확인하세요
rrreee
쿼리된 값은ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_C REATE_입니다. USER,NO_ENGINE_SUBSTITUTION
2. ONLY_FULL_GROUP_BY를 제거하고 값을 재설정하세요. .
rrreee
3. 위의 내용은 새로 생성된 데이터베이스에 유효한 전역 sql_mode를 변경합니다.
기존 데이터베이스의 경우 해당 데이터 아래에서 실행해야 합니다rrreee위의 방법은 mysql 데이터베이스를 다시 시작한 후에도 여전히 유효하지 않으며, 다음 방법은 다시 시작한 후에도 여전히 유효합니다
MySQL
파일, linux
시스템의 /etc/my.cnf
파일에서 sql_mode
필드를 쿼리합니다. 구성 파일에서 이 키워드를 찾을 수 없어서 수동으로 추가했습니다. 🎜rrreee🎜한 가지 주의할 점은 [mysqld]
구성에 추가해야 하므로 추가한 후 다시 시작하세요. mysql
이 적용되고 종료됩니다. 데이터베이스: 종료, 다시 시작 명령: 🎜rrreee🎜페이지를 새로 고치면 오류 메시지가 사라지고 성공적으로 해결됩니다. sql_mode code>를 구성하세요. SQL_mode의 참조: 🎜🎜🎜ONLY_FULL_GROUP_BY: GROUP BY 집계 작업의 경우 SELECT의 열이 GROUP BY에 나타나지 않으면 열이 GROUP BY 절에 없기 때문에 이 SQL은 유효하지 않습니다🎜🎜NO_AUTO_VALUE_ON_ZERO : 이 값은 자동 증가 열의 삽입에 영향을 줍니다. 기본 설정에서 0 또는 NULL을 삽입하면 다음 자동 증가 값이 생성되는 것을 나타냅니다. 이 옵션은 사용자가 0 값을 삽입하려고 하고 열이 자동 증가하는 경우 유용합니다. 🎜🎜STRICT_TRANS_TABLES: 이 모드에서는 트랜잭션 테이블에 값을 삽입할 수 없으면 현재 작업이 중단되고 비 트랜잭션 테이블에는 제한이 없습니다. 🎜🎜NO_ZERO_IN_DATE: 엄격 모드에서는 날짜와 월이 지정됩니다. not allowed to be zero🎜 🎜NO_ZERO_DATE: 이 값을 설정하면 mysql 데이터베이스는 0 날짜 삽입을 허용하지 않으며 0 날짜를 삽입하면 경고 대신 오류가 발생합니다. 🎜🎜ERROR_FOR_DIVISION_BY_ZERO: INSERT 또는 UPDATE 중에 데이터를 0으로 나누면 경고 대신 오류가 생성됩니다. 모드가 지정되지 않은 경우 데이터가 0으로 나누어지면 MySQL은 NULL을 반환합니다. 🎜🎜NO_AUTO_CREATE_USER: GRANT가 빈 비밀번호를 사용하여 사용자를 생성하지 못하도록 합니다. 🎜🎜NO_ENGINE_SUBSTITUTION: 필요한 스토리지 엔진이 비활성화되거나 컴파일되지 않은 경우 오류가 발생합니다. 이 값이 설정되지 않으면 기본 스토리지 엔진이 대신 사용되며 예외가 발생합니다. 🎜🎜PIPES_AS_CONCAT: "||"를 OR 연산자 대신 문자열 연결 연산자로 처리합니다. 문자열 연결 함수 Concat🎜🎜ANSI_QUOTES: ANSI_QUOTES를 활성화한 후에는 식별자로 해석되므로 큰따옴표를 사용하여 문자열을 인용할 수 없습니다. 🎜🎜추천 학습: "🎜MySQL 비디오 튜토리얼🎜"🎜🎜
위 내용은 MySQL 설정 only_full_group_by의 오류 보고 문제를 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!