誤って次のようにONLY_FULL_GROUP_BYモードを有効にしました:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
どうすれば無効にできますか?
column
)関数を使用してクエリを改良できます。こちらのドキュメントをご覧ください
誤って次のようにONLY_FULL_GROUP_BYモードを有効にしました:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
どうすれば無効にできますか?
column
)関数を使用してクエリを改良できます。こちらのドキュメントをご覧ください
回答:
解決策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を削除する
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')
、MySQLは、とにかくレコードから不要なカンマを削除します。OPの答えは正しいです。
GLOBAL
私にはうまくいきませんでしたが、SESSION
うまくいきました。SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
現在の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と互換性がありません。 "これらの手順を実行します。
sudo nano /etc/mysql/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"
sudo service mysql restart
MySQLを再起動する
これはすべてのユーザーONLY_FULL_GROUP_BY
に対して無効になります
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
はこのファイルではなく、インクルードディレクトリにある可能性があります。最初に、このコマンドを使用します。grep -R "\[mysqld\]" *
そこに何があるか確認するために-とそのことを試してみるためにgrep -R "\bsql_mode\b" *
注意して使用してください
SET sql_mode = ''
これにより、実際に現在有効になっているすべてのモードがクリアされます。他の設定を台無しにしたくない場合は、
SELECT @@sql_mode
最初に、有効なモードのコンマ区切りのリストを取得し、次にONLY_FULL_GROUP_BY
オプションなしでこのリストに設定します。
then SET it to this list without the ONLY_FULL_GROUP_BY option.
ですか?
sql_mode=<comma-separated-list>
から、サーバーを停止して起動します。my.cnfの場所と編集の最良の方法については、オペレーティングシステムのドキュメントに従ってください。
これを試してみてください:
SET sql_mode = ''
コミュニティノート:以下の回答で指摘されているように、これにより実際に現在有効になっているすべてのSQLモードがクリアされます。それは必ずしもあなたが望むものではないかもしれません。
''
= 'full group by is disabled'
?MySQLはかなり馬鹿げたことをしますが、それはそれで終わりです。
0 rows affected
て、私のクエリはまだ動作しません:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
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;
sql_mode
以前の値にロールバックしました。私は今何ができますか?
既存のモードを削除せずに、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
@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',''))"
これは私にとってはうまくいきました。
SET NAMES
。この方法を使用して、ほとんどの場合、それが必要とされていないsymfonyはすでに者を設定し、それを経由してdoctrine.dbal.charset cofnig:symfony.com/doc/current/reference/configuration/doctrine.html、そしてPDO dnsを介して適切にそれを行うと、SET NAMESは古い方法で行われます。これは、5.3以降のPHPバージョンには使用しないでください
オン:
行う:
$ 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
/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
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
代わりに新しいファイルを作成することが重要かもしれません
@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値の拒否を抑制するために使用できます。詳細については、こちらをご覧ください。
ANY_VALUE()
MySQLのドキュメントはまた、次のメソッドを指定します。
sql-mode="<modes>"
my.cnf(UNIXオペレーティングシステム)やmy.ini(Windows)などのオプションファイルで設定します。--sql-mode="<modes>"
オプションを使用します。*ここに<modes>
、コンマで区切られたさまざまなモードのリストがあります。
SQLモードを明示的にクリアする--sql-mode=""
には、コマンドラインまたはsql-mode=""
オプションファイルで、SQLモードを空の文字列に設定します。
私はにsql-mode=""
オプションを追加し/etc/my.cnf
、それはうまくいきました。
このSOソリューションでは、MySQLで使用されているmy.cnfファイルを見つける方法について説明します。
変更後、MySQLを再起動することを忘れないでください。
SELECT @@GLOBAL.sql_mode;
私の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
sql_mode := ''
可能であると主張しています。なぜあなたは反対しますか?
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コンソールにログインしようとする最後のテストを実行します。ここにあります!
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/
それが誰かを助けることを願っています!
sql_mode
MySQL 5.7.9以降
からモードを追加または削除するにはsql_mode
、list_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
''
私は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をアクティブにする必要があります。
cPanel / WHMを備えたVPS /サーバーを実行しているユーザーに対しては、次のようにしてONLY_FULL_GROUP_BYを永久に無効にすることができます。
ルートアクセスが必要です(VPSまたは専用サーバー上)
rootとしてWHMを入力し、phpMyAdminを実行します。
変数をクリックし、を探し、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
SFTP経由でサーバーに接続する-SSH(ルート)とファイルのダウンロード /etc/my.cnf
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
my.cnf
ファイルを保存してアップロードし直します/etc/
WHMを入力し、「WHM>サービスの再起動> SQL Server(MySQL)」に移動して、サービスを再起動します
私はmysqlで作業し、rootユーザーで登録しました。私のために機能する解決策は次のとおりです。
mysql> SET SESSION sql_mode =(SELECT REPLACE(@@ sql_mode、 'ONLY_FULL_GROUP_BY'、 ''));
これは、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
エラーなしでログインできる場合-これで準備は完了です。
あなたは設定ファイルを使用してそれを無効にすることができます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"
SET sql_mode = ''
か?