Maison  >  Article  >  base de données  >  Un article expliquant en détail le problème de rapport d'erreurs du paramètre MySQL only_full_group_by

Un article expliquant en détail le problème de rapport d'erreurs du paramètre MySQL only_full_group_by

藏色散人
藏色散人avant
2023-01-24 07:30:012544parcourir

Un article expliquant en détail le problème de rapport d'erreurs du paramètre MySQL only_full_group_by

L'environnement de développement est connecté à mysql5.6, tandis que l'environnement de test est mysql5.7. Pendant le développement, un ami a écrit une instruction sql à propos de group by. Il fonctionne normalement dans l'environnement de développement, mais des exceptions sont trouvées dans l'environnement de test. mysql5.6,而测试环境是 mysql5.7。开发中有小伙伴写了有关 group bysql 语句。在开发环境中运行是正常的,而到了测试环境中就发现了异常。

原因分析: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

Analyse des causes : la version MySQL5.7 a l'attribut mysql sql_mode = only_full_group_by défini par défaut, provoquant une erreur.

Parmi eux, ONLY_FULL_GROUP_BY est le coupable de cette erreur Dans ce mode strict, pour l'opération d'agrégation group by, si en select Le. les colonnes n'apparaissent pas dans group by, alors ce SQL est illégal. Parce que dans le sql écrit par le développeur, la colonne select n'est pas dans la clause group by lors de l'utilisation de group bycode> Signaler une erreur. <p></p>L'environnement de test a téléchargé et installé la dernière version de <code>mysql5.7.x Le mode only_full_group_by est activé par défaut.

1. Vérifiez sql_mode

rrreee

La valeur demandée est :

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. Supprimez ONLY_FULL_GROUP_BY et réinitialisez la valeur. .

rrreee

3. Ce qui précède modifie le sql_mode global, qui est valable pour la base de données nouvellement créée.

Pour les bases de données existantes, vous devez l'exécuter sous les données correspondantes

rrreeeLa méthode ci-dessus est toujours invalide après le redémarrage de la base de données mysql, et la méthode suivante est toujours efficace après le redémarrage

🎜Trouver la configuration de Fichier MySQL, dans le fichier /etc/my.cnf sur le système linux, interrogez le champ sql_mode que j'ai fait. Je n'ai pas trouvé ce mot-clé dans le fichier de configuration, je l'ai donc ajouté manuellement : 🎜rrreee🎜Une chose à noter est qu'il doit être ajouté dans la configuration [mysqld], afin qu'après l'avoir ajouté, redémarrez. mysql pour prendre effet et quitter. Base de données : quitter, redémarrer la commande : 🎜rrreee🎜Actualisez la page et le message d'erreur disparaît et est résolu avec succès. Connectez-vous à nouveau à la base de données pour afficher le sql_modecode>. Configurez <code>select @@sql_mode : 🎜
🎜STRICT_TRANS_TABLES . Voilà, plus Mysql5.7 ONLY_FULL_GROUP_BY🎜🎜🎜Voici la signification des valeurs communes. ​​​​de sql_mode, référence : 🎜🎜🎜ONLY_FULL_GROUP_BY : Pour les opérations d'agrégation GROUP BY, si la colonne dans SELECT, il n'y a pas d'apparition dans GROUP BY, alors ce SQL est illégal car la colonne n'est pas dans la clause GROUP BY🎜 🎜NO_AUTO_VALUE_ON_ZERO : Cette valeur affecte l'insertion de colonnes à augmentation automatique. Dans les paramètres par défaut, l'insertion de 0 ou NULL représente la génération de la prochaine valeur auto-augmentante. Cette option est utile si l'utilisateur souhaite insérer une valeur de 0 et que la colonne s'augmente automatiquement. 🎜🎜STRICT_TRANS_TABLES : Dans ce mode, si une valeur ne peut pas être insérée dans une table de transactions, l'opération en cours sera interrompue, et il n'y aura aucune limite sur les tables non-transactions 🎜🎜NO_ZERO_IN_DATE : En mode strict, les dates et les mois sont. pas autorisé à être zéro🎜 🎜NO_ZERO_DATE : définir cette valeur. La base de données MySQL ne permet pas l'insertion de dates nulles. L'insertion de dates nulles générera une erreur au lieu d'un avertissement. 🎜🎜ERROR_FOR_DIVISION_BY_ZERO : Lors d'un INSERT ou d'un UPDATE, si les données sont divisées par zéro, une erreur est générée au lieu d'un avertissement. Si le mode n'est pas donné, MySQL renvoie NULL lorsque les données sont divisées par zéro 🎜🎜NO_AUTO_CREATE_USER : empêche GRANT de créer des utilisateurs avec des mots de passe vides 🎜🎜NO_ENGINE_SUBSTITUTION : renvoie une erreur si le moteur de stockage requis est désactivé ou n'est pas compilé. Lorsque cette valeur n'est pas définie, le moteur de stockage par défaut est utilisé à la place et une exception est levée. 🎜🎜PIPES_AS_CONCAT : traitez "||" comme un opérateur de connexion de chaîne au lieu d'un opérateur OR. à la fonction de concaténation de chaînes Concat🎜🎜ANSI_QUOTES : Après avoir activé ANSI_QUOTES, les guillemets doubles ne peuvent pas être utilisés pour citer la chaîne car elle est interprétée comme un identifiant. 🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer