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 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
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.
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 correspondantesrrreeeLa 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
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!