Après MySQL 5.7, only_full_group_by est activé par défaut, ce qui conduit à une détection SQL plus stricte, ce qui entraînera le signalement de l'erreur suivanteIl n'y a aucun moyen pour résoudre ce problème. Évitez les détours et essayez un par un selon les méthodes trouvées en ligneSQLSTATE[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
Idées de solutions
Voir sql_modeselect @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode
[mysqld]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES<.>Redémarrez MySQL, vérifiez sql_mode dans l'outil MySQL, cela montre que le résultat est le même que la configuration, mais le programme signale toujours la même erreur
paramètres des variables mysql Il existe deux manières,
un global une configuration, c'est-à-dire globale, qui agit sur le monde entier ;Est-ce que ce sera possible ? sql_mode
dans la connexion actuelle Lorsque le programme laravel imprime sql_mode
[client]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
. La première chose qui me vient à l'esprit est mysql. Il y a un mode strict dans la configuration, je l'ai toujours activé et je l'ai défini sur false. Le problème a été résolu avec succès
$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_SUBSTITUTIONCela peut résoudre le problème. problème, mais basé sur la technologie, je veux juste comprendre comment il est écrit, et je ne veux pas le définir directement sur false,
'strict' => false,
pour le faire
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(); } }}
Testez et résolvez le problème directement
Dans l'esprit de la recherche racine, continuons la lecture
Si strict = true
sera défini directement dans le programme sql_mode codé en dur, laravel distingue mysql 8.0.11 des autres versions
'modes' => ['STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_pISION_BY_ZERO', 'NO_AUTO_CREATE_USER', 'NO_ENGINE_SUBSTITUTION'],
Puis si strict = false, définissez directement sql_mode sur NO_ENGINE_SUBSTITUTION
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'"; }
Le problème est complètement résolu ici
La solution finale
$connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute();
conservé strict = true et ajouté l'option modes Les paramètres à l'intérieur. sont la configuration sous-jacente de laravel, mais seulement supprimés ONLY_FULL_GROUP_BY
Résumé : Après avoir fait de nombreux détours et passé beaucoup de temps, le problème a finalement été résolu et il n'a pas été nécessaire de modifier quoi que ce soit. configuration de mysql
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!