Nonaktifkan ONLY_FULL_GROUP_BY

615

Saya secara tidak sengaja mengaktifkan mode ONLY_FULL_GROUP_BY seperti ini:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Bagaimana cara menonaktifkannya?

ZviBar
sumber
39
Sudahkah Anda mencoba SET sql_mode = ''?
Tripp Kinetics
4
Mengapa Anda ingin menonaktifkan mode yang membuat MySQL lebih sesuai dengan standar SQL, dan satu juga, yang mengajarkan Anda untuk lebih berhati-hati dalam menulis pertanyaan Anda?
Andriy M
34
Pada Mysql 5.7 Anda dapat, sebagai alternatif, menggunakan fungsi ANY_VALUE ( column) untuk me -retrofit permintaan Anda. Lihat dokumen di sini
Qoheleth-Tech
3
@AndriyM Saya harus segera menggunakan ini karena saya porting seluruh aplikasi lama ke server baru dan mereka perlu bekerja, apakah saya punya sumber atau tidak.
Jaydee
8
@AndriyM Karena jika saya mengelompokkan berdasarkan kolom indeks unik, maka saya SUDAH tahu bahwa setiap baris akan unik - menambahkan grup terpisah dengan perintah untuk setiap. tunggal. kolom. di meja adalah rasa sakit kerajaan.
Benubird

Jawaban:

1163

Solusi 1: Hapus ONLY_FULL_GROUP_BY dari konsol mysql

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

Anda dapat membaca lebih lanjut di sini

Solusi 2: Hapus ONLY_FULL_GROUP_BY dari phpmyadmin

  • Buka phpmyadmin & pilih localhost
  • Klik pada menu Variabel & gulir ke bawah untuk mode sql
  • Klik tombol edit untuk mengubah nilai & menghapus ONLY_FULL_GROUP_BY & klik simpan. masukkan deskripsi gambar di sini
Eyo Okon Eyo
sumber
12
Solusi ini berfungsi dengan baik pada mySQL 5.7.11 dan harus diterima. Jawaban yang diterima tidak berfungsi pada versi baru mySQL
Anyone_ph
4
Baru dipastikan. Tidak masalah REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL tetap menghapus koma yang tidak diinginkan dari catatan. Jawaban OP benar.
nawfal
40
Ini berfungsi, tetapi ketika saya me-restart server mysql, default dikembalikan ... mengapa? apakah ada solusi yang gigih? Terima kasih!
Vincent Pazeller
52
Untuk menjawab pertanyaan saya (solusi persisten): Anda harus memasukkan deskripsi sql_mode di dalam file my.cnf (/etc/my.cnf misalnya) dan restart server. Misalnya, insert (di bawah [mysqld] bagian) 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
GLOBALtidak bekerja untuk saya, tetapi SESSIONberhasil. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre
371

Memperbarui:

masukkan deskripsi gambar di sini

Untuk mempertahankan dan menonaktifkan pengaturan mysql Anda saat ini, ONLY_FULL_GROUP_BYsaya sarankan untuk mengunjungi phpmyadmin Anda atau klien apa pun yang Anda gunakan dan ketik:

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

hasil salinan selanjutnya ke my.inifile Anda .

mint :sudo nano /etc/mysql/my.cnf

ubuntu 16 dan lebih tinggi :sudo nano /etc/mysql/my.cnf

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

Peringatan! copy_mehasil dapat berisi teks panjang yang mungkin dipangkas secara default. Pastikan Anda menyalin seluruh teks!


jawaban lama:

Jika Anda ingin menonaktifkan kesalahan secara permanen " Ekspresi #N dari daftar SELECT tidak dalam klausa GROUP BY dan berisi kolom nonaggregated 'db.table.COL' yang tidak secara fungsional bergantung pada kolom dalam klausa GROUP BY, ini tidak sesuai dengan sql_mode = only_full_group_by "lakukan langkah-langkah itu:

  1. sudo nano /etc/mysql/my.cnf
  2. Tambahkan ini ke akhir file

    [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 untuk me-restart MySQL

Ini akan menonaktifkan ONLY_FULL_GROUP_BYuntuk SEMUA pengguna

breq
sumber
2
bagi saya, pengaturan tag mysqld pada baris yang sama tidak bekerja, tetapi tidak berfungsi dengan jeda baris :) terima kasih
bloub
23
Untuk ubuntu, file tempat nilai konfigurasi khusus adalah/etc/mysql/mysql.conf.d/mysqld.cnf
knb
5
Ini bekerja untuk Ubuntu 16.04 (peningkatan 14 sampai 16 kesengsaraan ..). /Etc/mysql/my.cnf adalah file yang benar. File yang disebutkan oleh knb termasuk dalam file my.cnf ini, setidaknya dalam 16,04 (konfigurasi sekarang dibagi menjadi beberapa file).
jwinn
2
Gunakan "SELECT @@ sql_mode;" untuk melihat mode apa yang sedang aktif sebelum melakukan perubahan.
Zbigniew Ledwoń
1
tempat aktual tempat Anda akan melihat [mysqld]mungkin tidak ada di file ini, mungkin di direktori include. Gunakan perintah ini terlebih dahulu: grep -R "\[mysqld\]" *untuk melihat apa yang ada - dan dalam hal ini cobagrep -R "\bsql_mode\b" *
Oliver Williams
203

Hati-hati menggunakan

SET sql_mode = '' 

Ini sebenarnya membersihkan semua mode yang saat ini diaktifkan. Jika Anda tidak ingin mengacaukan dengan pengaturan lain, Anda ingin melakukan

SELECT @@sql_mode 

pertama, untuk mengaktifkan daftar mode yang dipisahkan koma, lalu SET ke daftar ini tanpa ONLY_FULL_GROUP_BYopsi.

Taran
sumber
Apa cara terbaik untuk melakukan ini then SET it to this list without the ONLY_FULL_GROUP_BY option.:?
Kevin Meredith
4
@KevinMeredith pembacaan dokumen saya adalah tidak ada cara untuk mengaktifkan / menonaktifkan satu mode pada satu waktu - semua contoh mengharuskan Anda untuk menyediakan daftar yang dipisahkan koma dari yang Anda inginkan - misalnyaSET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
William Turrell
1
Jika ini adalah perubahan permanen, edit my.cnf dengan baris seperti ini sql_mode=<comma-separated-list>:, lalu berhenti dan mulai server Anda. Ikuti dokumen untuk sistem operasi Anda untuk lokasi, dan cara terbaik untuk mengedit, my.cnf.
kayu hitam
107

Cobalah ini:

SET sql_mode = ''

Catatan Komunitas: Seperti yang ditunjukkan dalam jawaban di bawah, ini sebenarnya menghapus semua mode SQL yang saat ini diaktifkan. Itu belum tentu yang Anda inginkan.

Kinetika Tripp
sumber
11
Wow, ''= 'full group by is disabled'? MySQL melakukan beberapa hal yang sangat bodoh tetapi yang di atas sana.
Aaron Bertrand
38
Saya pikir ini pada dasarnya menonaktifkan mode sql;
ZviBar
Ini tidak berhasil untuk saya. Saya melihat 0 rows affecteddan permintaan saya masih tidak berfungsi:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber
10
Sebelum mencoba jawaban ini, pasti lihat peringatan Machavity dan jika Anda ingin perubahan tetap ada, pastikan untuk menggunakan globaldalam perintah .
thomas88wp
6
Setiap kali ketika saya kembali ke MySql setelah beberapa waktu, saya selalu menemui masalah ini yang mengganggu saya, karena saya selalu lupa apa masalahnya :) Perasaan itu hanya mengecewakan, ketika Anda berpikir itu berfungsi dan sekarang tidak karena perubahan versi.
X-HuMan
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;
WeiYuan
sumber
@ RémiBreton: apa versi mysql Anda?
WeiYuan
6
Ini memang berhasil. Tetapi setelah saya me-restart sistem saya (ubuntu 16.04), sql_moderollback ke nilai sebelumnya. Apa yang bisa saya lakukan sekarang?
pktangyue
luar biasa, bekerja untuk saya, hanya saya perlu mengubahnya secara permanen
Fernando Torres
74

Menambahkan hanya satu mode ke sql_mode tanpa menghapus yang sudah ada:

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

Menghapus hanya mode tertentu dari sql_mode tanpa menghapus yang lain:

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

Dalam kasus Anda, jika Anda ingin menghapus hanya ONLY_FULL_GROUP_BYmode, maka gunakan perintah di bawah ini:

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

Referensi: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html

Janaka R Rajapaksha
sumber
Ini jawaban yang bagus! Terima kasih.
wedi
1
Apakah ini bersifat global atau pada koneksi saat ini? Jawaban bagus!
Oliver M Grech
48

Terima kasih kepada @cwhisperer. Saya memiliki masalah yang sama dengan Doctrine di aplikasi Symfony. Saya baru saja menambahkan opsi ke config.yml saya:

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

Ini bekerja dengan baik untuk saya.

Jelas
sumber
1
Dan jika perlu bergabung dengan SET NAMES 'utf8' gunakan mengikuti "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));"; Jika dua kueri digunakan sebagai gantinya "SET NAMES 'utf8'; SET sql_mod ..." ia akan melempar "Kesalahan umum: 2014 Tidak dapat mengeksekusi kueri sementara kueri yang tidak dikunci lainnya aktif."
Ventzy Kunev
@VentzyKunev tolong jangan ikuti saran ini dan jangan mengatur SET NAMESmenggunakan metode ini, dalam banyak kasus tidak diperlukan symfony sudah mengaturnya melalui doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , dan melakukannya dengan benar melalui PDO dns, SET NAMES adalah cara yang sudah ketinggalan zaman, yang seharusnya tidak digunakan untuk versi PHP yang lebih besar dari 5.3
LPodolski
39

Di:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16, untuk Linux (x86_64) menggunakan EditLine wrapper

Melakukan:

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

Salin dan tempel:

[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

Ke bagian bawah file

$ sudo service mysql restart
Jadeye
sumber
Apakah mysql.cnf tidak akan pernah ditimpa oleh pembaruan mysql?
cwhisperer
1
@cwhisperer /etc/mysql/mysql.cnfmenunjuk ke 2 folder konfigurasi !includedir /etc/mysql/conf.d/+ !includedir /etc/mysql/mysql.conf.d/. Sama berlaku untuk /etc/mysql/my.cnf. Oleh karena itu saya berasumsi bahwa file konfigurasi tidak diganti setelah pembaruan. Anda dapat membaca lebih lanjut di sinihttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye
Saya mencoba ini dan tidak berfungsi pada Ubuntu 18.04.2 bionic. Saya mengikuti ini dan berhasil: sitepoint.com/… - mungkin penting untuk menggunakan format ini dengan spasi dan tanda kutip: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"mungkin penting untuk membuat file baru /etc/mysql/mysql.conf.d/mysqld_mode.cnfsebagai gantinya
rubo77
Ini bekerja bahkan setelah server mysql restart
Akshay Khale
36

Saya perhatikan bahwa solusi @Eyo Okon Eyo berfungsi selama server MySQL tidak direstart, kemudian pengaturan default dipulihkan. Ini solusi permanen yang bekerja untuk saya:

Untuk menghapus mode SQL tertentu (dalam hal ini ONLY_FULL_GROUP_BY ), cari mode SQL saat ini:

SELECT @@GLOBAL.sql_mode;

salin hasilnya dan hapus apa yang tidak Anda butuhkan ( ONLY_FULL_GROUP_BY )

misalnya:

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

untuk

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

buat dan buka file ini:

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

dan tulis dan lewati ke dalamnya mode SQL baru Anda:

[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

restart MySQL:

sudo service mysql restart

Atau Anda dapat menggunakan ANY_VALUE()untuk menekan ONLY_FULL_GROUP_BY penolakan nilai, Anda dapat membaca lebih lanjut tentang hal ini di sini

Wakaf
sumber
3
Up forANY_VALUE()
Sithu
25

The dokumentasi MySQL juga menentukan metode berikut:

  • Atur sql-mode="<modes>"dalam file opsi seperti my.cnf (sistem operasi Unix) atau my.ini (Windows).
  • Untuk mengatur mode SQL pada startup server melalui baris perintah, gunakan --sql-mode="<modes>"opsi.

* Di mana <modes>daftar mode yang berbeda dipisahkan oleh koma.

Untuk menghapus mode SQL secara eksplisit, atur ke string kosong menggunakan --sql-mode=""pada baris perintah, atau sql-mode=""dalam file opsi.

Saya menambahkan sql-mode=""opsi ke /etc/my.cnfdan itu berhasil.

Solusi SO ini membahas cara untuk mencari tahu file my.cnf mana yang sedang digunakan oleh MySQL.

Jangan lupa untuk me-restart MySQL setelah membuat perubahan.

br3nt
sumber
1
ini jawaban yang tepat untuk saya `Ver 14.14 Distrib 5.7.10, untuk osx10.11 (x86_64)`
Sinux
ini harus ditandai jawaban yang benar. Jawaban lain tidak memberikan solusi permanen.
sijpkes
@ br3nt Bagaimana cara mendeteksi mode apa yang saat ini digunakan sehingga saya bisa menghapus mode yang tidak diinginkan jika saya tidak ingin membatalkan semua mode?
pemain simgineer
1
CobaSELECT @@GLOBAL.sql_mode;
br3nt
19

Jika Anda menggunakan WAMP. Klik kiri pada ikon WAMP lalu goto MySQL -> pengaturan MySQL -> sql-mode dan kemudian pilih sql-mode-> mode pengguna

Lihat gambar ini

Shiran Gabriel
sumber
Apakah ada alasan mengapa saya tidak memiliki Pengaturan MySQL di instal WAMP saya? Ada administrasi Layanan dan konsol MySQL tetapi tidak ada pengaturan?
Craig
Ini persis apa yang saya cari! Terima kasih telah menyediakan solusi WAMP Server yang sederhana! Saya memerlukan ini ketika mencoba melakukan #aggregation dalam tutorial ini: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010
12

Di sql saya (versi 5.7.11 berjalan pada Mac OS X) ini berfungsi untuk saya di klien shell 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"

Menurut Dokumentasi MySQL 5.6, sql_mode adalah default

string kosong di MySQL 5.6.5 dan kembali NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES dalam 5.6.6 +

referensi mysql 5.6

Salvatore Napoli
sumber
Jawaban lain mengklaim sql_mode := ''dimungkinkan. Mengapa Anda tidak setuju?
Hermann Döppes
Dari mana asal semua opsi di string Anda? Apa alasan di balik ini?
Hermann Döppes
Menurut Dokumentasi MySQL 5.6, sql_mode adalah default adalah string kosong di MySQL 5.6.5 dan kembali NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES di 5.6.6 dev.mysql.com/doc/refman/5.6/en/…
Salvatore Napoli
Terima kasih telah bekerja untuk saya di Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18, untuk Linux (x86_64) menggunakan EditLine wrapper
Paul Preibisch
12

Di MySQL 5.7 dan Ubuntu 16.04, edit file mysql.cnf.

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

Sertakan sql_mode seperti berikut dan simpan file.

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

Perhatikan bahwa, dalam kasus saya, saya menghapus mode STRICT_TRANS_TABLES dan ONLY_FULL_GROUP_BY.

Melakukan ini, itu akan menyimpan konfigurasi mode secara permanen. Berbeda jika Anda hanya memperbarui @@ sql_mode melalui MySQL, karena itu akan mengatur ulang pada mesin / layanan restart.

Setelah itu, agar konfigurasi yang dimodifikasi berfungsi, restart layanan mysql:

$ sudo service mysql restart

Cobalah mengakses mysql:

$ mysql -u user_name -p

Jika Anda dapat masuk dan mengakses konsol MySQL, tidak apa-apa. Bagus!

TAPI , jika seperti saya, Anda menghadapi kesalahan "variabel tidak dikenal sql_mode" , yang menunjukkan bahwa sql_mode adalah opsi untuk mysqld , Anda harus kembali, mengedit file mysql.cnf lagi dan mengubah [mysql]ke [mysqld]. Mulai ulang layanan MySQL dan lakukan tes terakhir mencoba masuk pada konsol MySQL. Ini dia!

Alexandre Ribeiro
sumber
1
Saya akan sangat merekomendasikan pendekatan yang disebutkan di atas daripada mengaturnya di sesi, terima kasih kepada @ alexandre-ribeiro. Bagi mereka yang memiliki Ubuntu 16.04 dan mysql 5.7.x, lebih baik edit file dan masukkan direktif ini sql_mode = <mode> di bawah grup [mysqld] , karena menyatakan terhadap [mysql] tidak berfungsi, sesuai pengalaman saya.
codarrior
Saya memiliki MySQL 5.7.22. Ini aneh, tapi aku harus menghapus kedua STRICT_TRANS_TABLES dan ONLY_FULL_GROUP_BY dari deklarasi sql_mode di my.cnf, seperti yang ditunjukkan di atas, untuk ini bekerja. Pada kenyataannya, saya hanya ingin menghapus mode ONLY_FULL_GROUP_BY. Jika saya "mengatur global / sesi sql_mode = ..." Saya dapat menghapus ONLY_FULL_GROUP_BY tanpa harus menghapus STRICT_TRANS_TABLES agar bisa berfungsi. Tapi karena ini tidak selamat restart, jadi tidak banyak gunanya bagiku.
RayCh
12

Ini yang saya lakukan untuk memperbaiki meja kerja Mysql:

Sebelum saya mendapat nilai saat ini dengan perintah di bawah ini

SELECT @@sql_mode 

kemudian saya menghapus kunci ONLY_FULL_GROUP_BY dari daftar dan saya menempelkan perintah di bawah ini

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'
Matt Vegas
sumber
10

Untuk Mac OS Mojave (10.14) Buka terminal

$ 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

Rekatkan sebagai berikut:

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

Shortkeys to Save & Exit nano: Ctrl+xand ydanEnter

Catatan: Anda mungkin perlu memperbaruimysql-5.7.24-macos10.14-x86_64dalam perintah ini, cukup periksa nama folder yang benar yang ada di dalamnya/usr/local/

Semoga ini bisa membantu seseorang!

AamirR
sumber
10

Tambah atau Hapus mode ke sql_mode

MySQL 5.7.9 atau lebih baru

Untuk menambah atau menghapus mode sql_mode, Anda dapat menggunakan list_adddan list_dropfungsinya.

Untuk menghapus mode dari saat ini SESSION.sql_mode, Anda dapat menggunakan salah satu dari berikut ini:

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');

Untuk menghapus mode dari GLOBAL.sql_modeyang ada untuk operasi runtime saat ini , hingga layanan dimulai kembali .

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

MySQL 5.7.8 atau sebelumnya

Karena sql_modenilainya adalah string mode CSV, Anda perlu memastikan bahwa string tersebut tidak mengandung koma residual, yang dapat diselesaikan dengan menggunakan TRIM(BOTH ',' FROM ...).

Untuk menghapus mode dari sql_modevariabel, Anda ingin menggunakannya REPLACE()bersama TRIM()untuk memastikan setiap koma residual dihapus.

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', ''));

Untuk menambahkan mode ke sql_modevariabel, Anda ingin menggunakan CONCAT_WS(',', ...), untuk memastikan koma ditambahkan dengan mode saat ini dan TRIM()untuk memastikan setiap koma residual dihapus.

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));

CATATAN: Mengubah GLOBALvariabel tidak menyebar ke SESSIONvariabel, hingga koneksi baru dibuat.

The GLOBALvariabel akan bertahan sampai layanan yang berjalan-restart.

The SESSIONvariabel akan bertahan untuk sambungan saat ini, sampai koneksi tertutup dan koneksi baru didirikan.


Kembalikan ke GLOBAL.sql_mode

Karena SET sql_mode = 'ONLY_FULL_GROUP_BY';dijalankan tanpa GLOBALpengubah, perubahan hanya memengaruhi nilai SESSIONkondisi saat ini , yang juga berkaitan dengan @@sql_mode. Untuk menghapusnya dan kembali ke default global pada nilai restart server , Anda ingin menggunakan nilai dari @@GLOBAL.sql_mode. [sic]

Nilai saat SESSIONini hanya berlaku untuk koneksi saat ini. Menghubungkan kembali ke server akan mengembalikan nilai kembali ke GLOBAL nilai.

Untuk mengembalikan nilai status sesi saat ini ke nilai global saat ini, Anda dapat menggunakan salah satu dari berikut ini:

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

Ubah SESSION.sql_modenilai menjadiONLY_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 |
+--------------------+----------------------------------------------+

Kembalikan SESSION.sql_modenilai ke GLOBAL.sql_modenilai

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 |
+----------------------------------------------+----------------------------------------------+

Server Restart Gigih sql_mode

Untuk mengatur mode SQL pada startup server, gunakan --sql-mode="modes"opsi pada baris perintah, atau sql-mode="modes"dalam file opsi seperti my.cnf (sistem operasi Unix) atau my.ini (Windows). [sic]

Silakan lihat versi MySQL Anda untuk menentukan mode yang didukung dan default .

[mysqld]

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

sql_modeNilai default

Karena nilai dokumentasi per versi MySQL telah dihapus, saya telah menambahkannya di sini untuk referensi Anda.

MySQL> = 8.0.11 8.0.5 - 8.0.10 Dilewati

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

''
fyrye
sumber
8

Jika Anda menggunakan MySQL 8.0.11, Anda harus menghapus 'NO_AUTO_CREATE_USER' dari sql-mode.

Tambahkan baris berikut dalam file /etc/mysql/my.cnfdan tajuk [mysqld]

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Hiren Bhut
sumber
sejauh ini jawaban ini berfungsi untuk 8.0.13
tomexsans
7

Saya menggunakan doktrin dan saya telah menambahkan driverOptions di doctrine.local.php saya:

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',''))"
                ),
            ),
        ),
    ),
));

Dalam phpmyadmin, pengguna perlu SUPER diaktifkan di hak istimewa.

pembisik
sumber
3
Menggunakan notasi yaml untuk mengkonfigurasi Doktrin (seperti yang dilakukan di Symfony) Anda perlu menggunakan "1002" alih-alih konstanta "PDO :: MYSQL_ATTR_INIT_COMMAND", namun demikian inilah yang saya cari beberapa minggu yang lalu dan tidak dapat menemukan di luar. Terima kasih atas solusinya! Bekerja untukku.
Arvid
5

Untuk siapa yang menjalankan VPS / Server dengan cPanel / WHM , Anda dapat melakukan hal berikut untuk menonaktifkan ONLY_FULL_GROUP_BY secara permanen

Anda memerlukan akses root (baik di VPS atau server khusus)

  1. Masukkan WHM sebagai root dan jalankan phpMyAdmin

  2. Klik pada Variabel, cari sql_mode, klik pada 'Edit' dan salin seluruh baris di dalam kotak teks itu

misalnya salin ini:

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. Terhubung ke server Anda melalui SFTP - SSH (root) dan unduh file /etc/my.cnf

  2. Buka dengan my.cnffile editor teks pada PC lokal Anda dan rekatkan ke dalamnya (di bawah [mysqld]bagian) seluruh baris yang Anda salin pada langkah (2) tetapi hapusONLY_FULL_GROUP_BY,

mis. tempel ini:

# 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. Simpan my.cnffile dan unggah kembali ke/etc/

  2. Masukkan WHM dan pergi ke "WHM> Restart Services> SQL Server (MySQL)" dan restart layanan

Marco Demaio
sumber
4

Saya bekerja dengan mysql dan terdaftar dengan pengguna root, solusi yang berfungsi untuk saya adalah sebagai berikut:

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

Jorge Santos Neill
sumber
3

Ini adalah solusi permanen untuk MySql 5.7+ di Ubuntu 14+:

$ 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

Jika Anda dapat masuk tanpa kesalahan - Anda harus siap sekarang.

demisx
sumber
1

Anda dapat menonaktifkannya menggunakan file konfigurasi my.cnf:

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

Jadi di macOS 10.12, di usr/local/etc/my.cnf. Anda dapat mengedit di sql_modesini:

# 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"
Dio Phung
sumber
1

Ini solusi saya mengubah konfigurasi Mysql melalui dashboard phpmyadmin:

Untuk memperbaiki "ini tidak kompatibel dengan sql_mode = only_full_group_by": Buka Halaman Utama phpmyadmin dan goto dan pilih submenu 'Variabel'. Gulir ke bawah untuk menemukan mode sql. Edit mode sql dan hapus 'ONLY_FULL_GROUP_BY' Simpan.

Marcello Perri
sumber
0

dengan MySQL versi 5.7.28 periksa dengan menggunakan
SELECT @@sql_mode; dan perbarui dengan

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'
Karthik
sumber