ONLY_FULL_GROUP_BYを無効にする


615

誤って次のようにONLY_FULL_GROUP_BYモードを有効にしました:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

どうすれば無効にできますか?


39
試しましたSET sql_mode = ''か?
Tripp Kinetics 2014年

4
MySQLをSQL標準に準拠させるためのモードを無効にしたいのはなぜですか。また、クエリの記述により注意するように指示するモードも無効にしますか?
Andriy M

34
Mysql 5.7以降では、代わりにANY_VALUE(column)関数を使用してクエリを改良できます。こちらのドキュメントをご覧ください
Qoheleth-Tech 2016

3
@AndriyM私はこれをすぐに使用する必要があります。これは、古いアプリケーションの全負荷を新しいサーバーに移植していて、ソースがあるかどうかに関係なく、動作する必要があるためです。
ジェイディー2016年

8
@AndriyM一意のインデックス列でグループ化している場合、すべての行が一意になることはすでにわかっているため、コマンドごとに個別のgroup byコマンドを追加します。シングル。カラム。テーブルには王室の痛みがあります。
Benubird 2017年

回答:


1163

解決策1:MySQLコンソールからONLY_FULL_GROUP_BYを 削除する

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

あなたはここでもっと読むことができます

解決策2: phpmyadminからONLY_FULL_GROUP_BYを削除する

  • phpmyadminを開き、localhostを選択します
  • [変数]メニューをクリックし、SQLモードの場合は下にスクロールします。
  • 編集ボタンをクリックして値を変更し、ONLY_FULL_GROUP_BYを削除して[保存]をクリックします。 ここに画像の説明を入力してください

12
このソリューションはmySQL 5.7.11で正常に動作し、受け入れられるはずです。受け入れられた回答は新しいバージョンのmySQLでは機能しません
Anyone_ph

4
ちょうど確保しました。それは問題ではありませんREPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')、MySQLは、とにかくレコードから不要なカンマを削除します。OPの答えは正しいです。
nawfal

40
これは機能しますが、mysqlサーバーを再起動すると、デフォルトが復元されます...なぜですか?永続的な解決策はありますか?ありがとう!
Vincent Pazeller 2016年

52
私の質問(永続的な解決策)に答えるには、sql_modeの説明をmy.cnfファイル(/etc/my.cnfなど)に入れ、サーバーを再起動する必要があります。たとえば、[[mysqld]セクションの下に)sql_mode = "STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION"
Vincent Pazeller

21
GLOBAL私にはうまくいきませんでしたが、SESSIONうまくいきました。SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre

371

更新:

ここに画像の説明を入力してください

現在のmysql設定を保持して無効ONLY_FULL_GROUP_BYにするには、phpmyadminまたは使用しているクライアントにアクセスして次のように入力することをお勧めします。

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

次の結果をmy.iniファイルにコピーします。

ミントsudo nano /etc/mysql/my.cnf

ubuntu 16以降sudo nano /etc/mysql/my.cnf

ubuntu 14-16/etc/mysql/mysql.conf.d/mysqld.cnf

注意!copy_me結果には、デフォルトでトリミングされる可能性のある長いテキストを含めることができます。テキスト全体をコピーしてください。


古い答え:

永続的にエラーを無効にする場合は、「SELECTリストの式#NがGROUP BY句になく、GROUP BY句の列に機能的に依存しない非集計列 'db.table.COL'が含まれています。これはsql_mode = only_full_group_byと互換性がありません。 "これらの手順を実行します。

  1. sudo nano /etc/mysql/my.cnf
  2. これをファイルの最後に追加します

    [mysqld]  
    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. sudo service mysql restart MySQLを再起動する

これはすべてのユーザーONLY_FULL_GROUP_BYに対して無効になります


2
私にとって、同じ行にmysqldタグを設定することは機能しませんでしたが、改行で機能しました:)ありがとう
bloub

23
ubuntuの場合、カスタム構成値が保存されるファイルは/etc/mysql/mysql.conf.d/mysqld.cnf
knb

5
これは、Ubuntu 16.04(14から16へのアップグレードの問題)で機能しました。/etc/mysql/my.cnfが正しいファイルです。knbによって言及されたファイルは、少なくとも16.04ではこのmy.cnfファイルに含まれています(設定は複数のファイルに分割されています)。
jwinn 16

2
「SELECT @@ sql_mode;」を使用します 変更を加える前に、現在どのモードになっているかを確認します。
ZbigniewLedwoń2017年

1
実際に表示される場所[mysqld]はこのファイルではなく、インクルードディレクトリにある可能性があります。最初に、このコマンドを使用します。grep -R "\[mysqld\]" *そこに何があるか確認するために-とそのことを試してみるためにgrep -R "\bsql_mode\b" *
オリバー・ウィリアムズ

203

注意して使用してください

SET sql_mode = '' 

これにより、実際に現在有効になっているすべてのモードがクリアされます。他の設定を台無しにしたくない場合は、

SELECT @@sql_mode 

最初に、有効なモードのコンマ区切りのリストを取得し、次にONLY_FULL_GROUP_BYオプションなしでこのリストに設定します。


これを行う最良の方法は何then SET it to this list without the ONLY_FULL_GROUP_BY option.ですか?
ケビンメレディス

4
私の読書@KevinMeredith ドキュメントがある時に/ 1モードをオフにする方法はありません-例えば-すべての例は、あなたが望むもののカンマ区切りのリストを供給する必要が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';
ウィリアム・タレル

1
これが永続的な変更である場合は、my.cnfを次のような行で編集してsql_mode=<comma-separated-list>から、サーバーを停止して起動します。my.cnfの場所と編集の最良の方法については、オペレーティングシステムのドキュメントに従ってください。
ブラックウッド

107

これを試してみてください:

SET sql_mode = ''

コミュニティノート:以下の回答で指摘されているように、これにより実際に現在有効になっているすべてのSQLモードがクリアされます。それは必ずしもあなたが望むものではないかもしれません。


11
わあ、''= 'full group by is disabled'?MySQLはかなり馬鹿げたことをしますが、それはそれで終わりです。
アーロンベルトラン2014年

38
これは基本的にSQLモードを無効にするものだと思います。
ZviBar 2014年

これは私にはうまくいきませんでした。私が見0 rows affectedて、私のクエリはまだ動作しません:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
マックスHeiber

10
この回答を試す前に、必ずMachavityの警告を確認してください。変更を持続させたい場合は、コマンドで使用globalしてください
thomas88wp

6
しばらくしてからMySqlに戻るたびに、この問題に常に直面しています。何が問題なのかをいつも忘れているので、私はいつも困っています。バージョン変更のため。
X-HuMan 2016年

106
    mysql> 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';
    mysql> set session 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> exit;

@RémiBreton:mysqlのバージョンは何ですか?
WeiYuan 2016年

6
これは確かに機能します。しかし、システムを再起動した後(ubuntu 16.04)、sql_mode以前の値にロールバックしました。私は今何ができますか?
pktangyue 2016年

素晴らしい、私のために働いた、私はこれを永久に変換する必要があるだけだ
フェルナンド・トレス

74

既存のモードを削除せずに、sql_modeにモードを1つだけ追加します。

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

他を削除せずにsql_modeから特定のモードのみを削除します。

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

あなたの場合、ONLY_FULL_GROUP_BYモードのみを削除したい場合は、以下のコマンドを使用してください:

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

リファレンス:http : //johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html


これは素晴らしい答えです!ありがとう。
wedi

1
これはグローバルですか、現在の接続ですか?正解です。
Oliver M Grech

48

@cwhispererに感謝します。SymfonyアプリのDoctrineでも同じ問題が発生しました。オプションをconfig.ymlに追加しました:

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

これは私にとってはうまくいきました。


1
また、SET NAMES 'utf8'と組み合わせる必要がある場合は、「SET NAMES 'utf8'、sql_mode =(SELECT REPLACE(@@ sql_mode、 'ONLY_FULL_GROUP_BY'、 ''));」を使用します。代わりに「SET NAMES 'utf8'; SET sql_mod ...」のように2つのクエリを使用すると、「一般エラー:2014バッファリングされていない他のクエリがアクティブな間はクエリを実行できません。」がスローされます。
Ventzy Kunev 2017

@VentzyKunevこのアドバイスに従わないと、設定しないでくださいSET NAMES。この方法を使用して、ほとんどの場合、それが必要とされていないsymfonyはすでに者を設定し、それを経由してdoctrine.dbal.charset cofnig:symfony.com/doc/current/reference/configuration/doctrine.html、そしてPDO dnsを介して適切にそれを行うと、SET NAMESは古い方法で行われます。これは、5.3以降のPHPバージョンには使用しないでください
LPodolski

39

オン:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16、EditLineラッパーを使用するLinux(x86_64)用

行う:

$ sudo nano /etc/mysql/conf.d/mysql.cnf

コピーアンドペースト:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

ファイルの最後に

$ sudo service mysql restart

mysql.cnfがmysqlの更新によって上書きされることはありませんか?
cwhisperer 2016年

1
@cwhisperer /etc/mysql/mysql.cnfは2つの構成フォルダー!includedir /etc/mysql/conf.d/+を指します!includedir /etc/mysql/mysql.conf.d/。同じことが当てはまります/etc/mysql/my.cnf。したがって、更新時に構成ファイルが上書きされないと想定しています。詳しくはこちらhttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye

私はこれを試しましたが、Ubuntu 18.04.2 bionicでは動作しませんでした。私はこれに従い、それは機能しました:sitepoint.com/…-スペースと引用符でこのフォーマットを使用するsql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"ことが重要かもしれません:/etc/mysql/mysql.conf.d/mysqld_mode.cnf代わりに新しいファイルを作成することが重要かもしれません
rubo77

これは、mysqlサーバーの再起動後も機能します
Akshay Khale

36

@Eyo Okon Eyoソリューションは、MySQLサーバーが再起動されない限り機能し、デフォルト設定が復元されることに気づきました。これは私のために働いた永続的な解決策です:

特定のSQLモード(この場合はONLY_FULL_GROUP_BY)を削除するには、現在のSQLモードを見つけます。

SELECT @@GLOBAL.sql_mode;

結果をコピーして、不要なものを削除します(ONLY_FULL_GROUP_BY

例えば:

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_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

このファイルを作成して開きます。

/etc/mysql/conf.d/disable_strict_mode.cnf

新しいSQLモードを書き込んでそこに貼り付けます。

[mysqld]
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を再起動します。

sudo service mysql restart

またはANY_VALUE()、ONLY_FULL_GROUP_BY値の拒否を抑制するために使用できます。詳細については、こちらをご覧ください。


3
アップのためにANY_VALUE()
Sithu

25

MySQLのドキュメントはまた、次のメソッドを指定します。

  • sql-mode="<modes>"my.cnf(UNIXオペレーティングシステム)やmy.ini(Windows)などのオプションファイルで設定します。
  • コマンドラインを使用してサーバーの起動時にSQLモードを設定するには、--sql-mode="<modes>"オプションを使用します。

*ここに<modes>、コンマで区切られたさまざまなモードのリストがあります。

SQLモードを明示的にクリアする--sql-mode=""には、コマンドラインまたはsql-mode=""オプションファイルで、SQLモードを空の文字列に設定します。

私はにsql-mode=""オプションを追加し/etc/my.cnf、それはうまくいきました。

このSOソリューションでは、MySQLで使用されているmy.cnfファイルを見つける方法について説明します。

変更後、MySQLを再起動することを忘れないでください。


1
これは私にとって正しい答えです。`Ver 14.14 Distrib 5.7.10、for osx10.11(x86_64) `
Sinux

これは正解とマークされているはずです。他の答えは恒久的な解決策を提供しません。
sijpkes

@ br3ntすべてのモードの設定を解除したくない場合に備えて、不要なモードを削除できるように、現在使用されているモードを検出するにはどうすればよいですか?
simgineer

1
試してみるSELECT @@GLOBAL.sql_mode;
br3nt

19

WAMPを使用している場合。WAMPアイコンを左クリックして、MySQL-> MySQL設定-> sql-modeに移動し、sql-mode-> userモードを選択します。

この画像をチェックアウト


WAMPインストールにMySQL設定がない理由はありますか?サービス管理とMySQLコンソールはありますが、設定はありませんか?
クレイグ

これがまさに私が探していたものです!シンプルなWAMPサーバーソリューションを提供していただきありがとうございます。このチュートリアルで#aggregationを実行するときにこれが必要でした:youtu.be/HXV3zeQKqGY
t=9718

12

私のsql(Mac OS Xで実行されているバージョン5.7.11)では、mysqlシェルクライアントでこれが機能します。

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"

MySQL 5.6ドキュメントによると、sql_modeはデフォルトで

MySQL 5.6.5の空の文字列と5.6.6以降のNO_ENGINE_SUBSTITUTION、STRICT_TRANS_TABLES

MySQL 5.6リファレンス


他の回答はsql_mode := ''可能であると主張しています。なぜあなたは反対しますか?
HermannDöppes2017年

文字列のこれらすべてのオプションはどこから来たのですか?これの背後にある理由は何ですか?
HermannDöppes2017年

MySQL 5.6のドキュメントによれば、sql_modeはデフォルトでMySQL 5.6.5の空の文字列であり、5.6.6のNO_ENGINE_SUBSTITUTION、STRICT_TRANS_TABLESに戻ります。dev.mysql.com/ doc / refman / 5.6 / en /…
Salvatore Napoli

おかげでUbuntuの16.04で私のために働いた- mysqlのLinux用14.14按分5.7.18、(x86_64版)VerはEditLineラッパー使用して
ポールPreibisch

12

MySQL 5.7およびUbuntu 16.04では、mysql.cnfファイルを編集します。

$ sudo nano /etc/mysql/conf.d/mysql.cnf

次のようにsql_modeを含め、ファイルを保存します。

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

私の場合、モードSTRICT_TRANS_TABLESとONLY_FULL_GROUP_BYを削除したことを確認します。

これを行うと、モード構成が永続的に保存されます。MySQLを介して@@ sql_modeを更新する場合とは異なり、マシン/サービスの再起動時にリセットされます。

その後、変更された構成を実行するには、mysqlサービスを再起動します。

$ sudo service mysql restart

mysqlにアクセスしてみます。

$ mysql -u user_name -p

ログインしてMySQLコンソールにアクセスできれば問題ありません。すごい!

しかし私のように、あなたがエラーに直面すると、「不明な変数のsql_mode」ことを示し、sql_modeのはのオプションでmysqldを、もう一度編集したファイルmysql.cnf、戻って変更する必要があります[mysql][mysqld]。MySQLサービスを再起動し、MySQLコンソールにログインしようとする最後のテストを実行します。ここにあります!


1
@ alexandre-ribeiroのおかげで、セッションで設定するよりも前述のアプローチを強くお勧めします。Ubuntu 16.04とmysql 5.7.xを使用している場合は、ファイルを編集して、[mysqld]グループの下にiniディレクティブsql_mode = <mode>を入力すると、[mysql]に対する宣言が機能しなくなります。
codarrior 2017

MySQL 5.7.22を持っています。これは奇妙ですが、上に示したように、これを機能させるには、my.cnfのsql_mode宣言からSTRICT_TRANS_TABLESとONLY_FULL_GROUP_BYの両方を削除する必要がありました。実際には、ONLY_FULL_GROUP_BYモードのみを削除します。「set global / session sql_mode = ...」を実行すると、STRICT_TRANS_TABLESを削除せずに、ONLY_FULL_GROUP_BYだけを削除して機能させることができます。しかし、これは再起動に耐えられないので、私にはあまり役に立ちません。
RayCh 2018年

12

これは、Mysqlワークベンチで修正するために実行したものです。

以下のコマンドで現在の値を取得する前に

SELECT @@sql_mode 

その後、リストからONLY_FULL_GROUP_BYキーを削除し、以下のコマンドを貼り付けました

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'

10

Mac OS Mojave(10.14)Openターミナルの場合

$ sudo mkdir /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ cd /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ sudo nano my.cnf

以下を貼り付け:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

nanoを保存して終了するためのショートカット:Ctrl+xおよびyおよびEnter

注:mysql-5.7.24-macos10.14-x86_64これらのコマンドで更新する必要がある場合があります。取得した正しいフォルダー名を確認してください/usr/local/

それが誰かを助けることを願っています!


10

モードの追加または削除 sql_mode

MySQL 5.7.9以降

からモードを追加または削除するにはsql_modelist_addおよびlist_drop関数を使用できます。

現在のからモードを削除するにSESSION.sql_modeは、次のいずれかを使用できます。

SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');

サービスが再起動されるまで、GLOBAL.sql_mode現在のランタイム操作に対して存続するからモードを削除します。

SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');

MySQL 5.7.8またはそれ以前

以来sql_mode値はモードのCSV文字列である、あなたは文字列が使用することによって達成することができる残留カンマを、含まれていないことを確認する必要がありますTRIM(BOTH ',' FROM ...)

sql_mode変数からモードを削除するには、とREPLACE()一緒に使用して、TRIM()残りのコンマを確実に削除します。

SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));

sql_mode変数にモードを追加するにはCONCAT_WS(',', ...)、を使用して、現在のモードにコンマが追加され、TRIM()残りのコンマが削除されるようにします。

SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));

注:GLOBAL変数を変更しても、新しい接続が確立されるまで変数に反映されませSESSION

GLOBAL実行中のサービスが再起動されるまで、変数が持続します。

SESSION接続が閉じられ、新しい接続が確立されるまで、変数は、現在の接続のために持続します。


に戻す GLOBAL.sql_mode

SET sql_mode = 'ONLY_FULL_GROUP_BY';GLOBAL修飾子なしで実行されたため、変更は現在のSESSION状態値にのみ影響し、これもに関係してい@@sql_modeます。これを削除して、サーバーの再起動時にグローバルなデフォルト値に戻すには、からの値を使用します@@GLOBAL.sql_mode[シック]

現在のSESSION値は、現在の接続でのみ有効です。サーバーに再接続すると、値が値に戻りGLOBAL ます。

現在のセッション状態の値を現在のグローバル値に戻すには、次のいずれかを使用できます。

SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;

変更SESSION.sql_modeに値ONLY_FULL_GROUP_BY

SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode         | @@GLOBAL.sql_mode                            |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+

SESSION.sql_mode値を値に戻しGLOBAL.sql_modeます

SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode                                   | @@GLOBAL.sql_mode                            |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+

サーバー再起動持続 sql_mode

サーバーの起動時にSQLモードを設定する--sql-mode="modes"には、コマンドラインsql-mode="modes"のオプション、またはmy.cnf(UNIXオペレーティングシステム)やmy.ini(Windows)などのオプションファイルでオプションを使用します。[シック]

MySQLのバージョンを確認して、サポートされているモードとデフォルトのモードを確認してください。

[mysqld]

sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4

デフォルトsql_mode

MySQLドキュメントのバージョンごとの値が削除されたため、参照用にここに追加しました。

MySQL> = 8.0.11 8.0.5-8.0.10スキップ

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.8、<= 8.0.4

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

MySQL 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.5、<= 5.7.6

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION

MySQL> = 5.6.6、<= 5.7.4

NO_ENGINE_SUBSTITUTION

MySQL <= 5.6.5

''

8

MySQL 8.0.11を使用している場合は、SQLモードから「NO_AUTO_CREATE_USER」を削除する必要があります。

ファイル/etc/mysql/my.cnfと[mysqld]ヘッダーに次の行を追加します

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

これまでのところ、この回答は8.0.13で機能します
tomexsans

7

私はdoctrineを使用しており、私のdoctrine.local.phpにdriverOptionsを追加しました:

return array(
'doctrine' => array(
    'connection' => array(
        'orm_default' => array(
            'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'params' => array(
                'host' => 'localhost',
                'port' => '3306',
                'user' => 'myusr',
                'password' => 'mypwd',
                'dbname' => 'mydb',
                'driverOptions' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
                ),
            ),
        ),
    ),
));

phpmyadminでは、ユーザーは特権でSUPERをアクティブにする必要があります。


3
(Symfonyで行われたように)Doctrineを構成するためにyaml表記を使用して、定数「PDO :: MYSQL_ATTR_INIT_COMMAND」の代わりに「1002」を使用する必要がありますが、これは私が数週間前に探していて見つけられませんでしたアウト。解決策をありがとう!私のために働いた。
2016年

5

cPanel / WHMを備えたVPS /サーバーを実行しているユーザーに対しては、次のようにしてONLY_FULL_GROUP_BYを永久に無効にすることができます。

ルートアクセスが必要です(VPSまたは専用サーバー上)

  1. rootとしてWHMを入力し、phpMyAdminを実行します。

  2. 変数をクリックし、を探し、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
  1. SFTP経由でサーバーに接続する-SSH(ルート)とファイルのダウンロード /etc/my.cnf

  2. my.cnfローカルPCのテキストエディターファイルで開き、[mysqld]手順(2)でコピーした行全体(セクションの下)に貼り付けますが、削除しますONLY_FULL_GROUP_BY,

例えばこれを貼り付けます:

# disabling ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. my.cnfファイルを保存してアップロードし直します/etc/

  2. WHMを入力し、「WHM>サービスの再起動> SQL Server(MySQL)」に移動して、サービスを再起動します


4

私はmysqlで作業し、rootユーザーで登録しました。私のために機能する解決策は次のとおりです。

mysql> SET SESSION sql_mode =(SELECT REPLACE(@@ sql_mode、 'ONLY_FULL_GROUP_BY'、 ''));


3

これは、Ubuntu 14以降のMySql 5.7以降の永続的なソリューションです。

$ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"  >> /etc/mysql/mysql.conf.d/mysqld.cnf"
$ sudo service mysql restart
# Check if login attempt throws any errors
$ mysql -u[user] -p # replace [user] with your own user name

エラーなしでログインできる場合-これで準備は完了です。


1

あなたは設定ファイルを使用してそれを無効にすることができますmy.cnf

$ mysql --verbose --help | grep my.cnf

つまり、macOS 10.12ではusr/local/etc/my.cnfです。sql_modeここで編集できます:

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

1

phpmyadminダッシュボードからMysql設定を変更する私のソリューションは次のとおりです。

「これはsql_mode = only_full_group_byと互換性がありません」を修正するには:phpmyadminを開いてホームページに移動し、「変数」サブメニューを選択します。下にスクロールしてSQLモードを見つけます。SQLモードを編集し、「ONLY_FULL_GROUP_BY」を削除して保存します。


0

MySQLバージョン5.7.28では、を使用
SELECT @@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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.