MYSQL only_Full_group_BY 문제를 해결하는 방법을 소개합니다. 필요한 친구들에게 도움이 되길 바랍니다! MySQL 5.7 이후에는 only_full_group_by가 기본적으로 활성화되어 SQL 감지가 더욱 엄격해지며 이로 인해 다음과 같은 오류가 보고됩니다.
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'edu.t_sounds.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
이 문제를 해결하기 위해 많은 우회가 필요했습니다. 온라인에서 찾은 방법대로Solution
sql_mode를 확인하세요select @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode
먼저 mysql 설정파일인 my.cnf를 확인해서 수정해주세요. ONLY_FULL_GROUP_BY
[mysqld]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
다시 검색해보니 갑자기 글로벌 세션의 문제, 즉 기사 머리 부분에 sql_mode를 쿼리하는 두 문장의 차이점을 확인해 보겠습니다.
laravel이 현재 연결에 sql_mode를 설정했을 수 있습니까?
$result = \DB::select('SELECT @@GLOBAL.sql_mode'); print_r($result);exit; 结果: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION $result = \DB::select('SELECT @@SESSION.sql_mode'); print_r($result);exit; 结果: 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
'strict' => false,
이렇게 하면 문제가 해결될 수 있지만 기술적인 측면에서 무슨 일이 일어나고 있는지 파악해야 합니다. 직접 false로 설정하고 싶지는 않습니다.
vendor/laravel/framework/src/ILLuminate/Database 폴더에서 strict를 검색하고 핵심 코드를 직접 찾으세요.
protected function setModes(PDO $connection, array $config){ if (isset($config['modes'])) { $this->setCustomModes($connection, $config); } elseif (isset($config['strict'])) { if ($config['strict']) { $connection->prepare($this->strictMode($connection))->execute(); } else { $connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute(); } }}
'modes' => ['STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_pISION_BY_ZERO', 'NO_AUTO_CREATE_USER', 'NO_ENGINE_SUBSTITUTION'],
루트 검색 정신으로 하단의 정신으로 계속 읽으십시오.
strict = true이면
은 프로그램에서 하드 코딩된 sql_mode를 직접 설정합니다. Laravel은 mysql 8.0.11을 다른 버전과 구별합니다
protected function strictMode(PDO $connection) { if (version_compare($connection->getAttribute(PDO::ATTR_SERVER_VERSION), '8.0.11') >= 0) { return "set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'"; } return "set 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'"; }
그리고 strict = false이면 직접 설정된 sql_mode가 NO_ENGINE_SUBSTITUTION
$connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute();
으로 설정됩니다. 여기서 문제는 완전히 해결되었습니다
최종 해결책
'strict' => true, 'modes' => ['STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_DIVISION_BY_ZERO', 'NO_AUTO_CREATE_USER', 'NO_ENGINE_SUBSTITUTION'],
은 strict = true를 유지하고 모드 옵션을 추가하며 내부 매개변수는 laravel의 기본 구성이지만 ONLY_FULL_GROUP_BY
만 제거합니다. 요약: 많은 우회를 한 후 많은 시간을 들여 마침내 문제가 해결되었고 mysql 구성을 수정할 필요도 없었습니다
위 내용은 laravel이 mysql only_full_group_by 문제를 해결하는 방법에 대해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!