ONLY_FULL_GROUP_BY'yi devre dışı bırak


614

Yanlışlıkla ONLY_FULL_GROUP_BY modunu şu şekilde etkinleştirdim:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Nasıl devre dışı bırakabilirim?


38
Denedin SET sql_mode = ''mi
Tripp Kinetiği

4
Neden MySQL'i SQL standartlarına daha iyi uyduran bir modu ve sorgularınızı yazarken daha dikkatli olmanızı öğreten bir modu devre dışı bırakmak istersiniz?
Andriy M

34
Mysql 5.7'den itibaren, columnsorgunuzu uyarlamak için ANY_VALUE ( ) işlevini kullanabilirsiniz. Buradaki
Qoheleth-Tech

3
@AndriyM Bu uygulamayı yakında kullanmam gerekecek çünkü eski uygulamaların tümünü yeni bir sunucuya taşıyorum ve kaynağım olsun ya da olmasın, çalışması gerekiyor.
Jaydee

8
@AndriyM Çünkü ben benzersiz bir dizin sütununa göre gruplandırma, o zaman her satır benzersiz olacağını biliyorum - her komut için ayrı bir grup ekleyerek. tek. sütunu. tabloda kraliyet ağrısı var.
Benubird

Yanıtlar:


1163

Çözüm 1: Kaldır ONLY_FULL_GROUP_BY MySQL konsolundan

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

daha fazla okuyabilirsin buradan

Çözüm 2: ONLY_FULL_GROUP_BY'yi kaldırın phpmyadmin'den

  • Phpmyadmin'i açın ve localhost'u seçin
  • Değişkenler menüsünü tıklayın ve sql modu için aşağı kaydırın
  • Değerleri değiştirmek için Düzenle düğmesini tıklayın ve ONLY_FULL_GROUP_BY'yi kaldırın ve kaydet'i tıklayın. resim açıklamasını buraya girin

12
Bu çözüm mySQL 5.7.11 üzerinde iyi çalışır ve kabul edilen çözüm olmalıdır. Kabul edilen cevap
mySQL'in

4
Sadece sağladım. Farketmez REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL yine de istenmeyen virgülleri kayıttan kaldırır. OP'nin cevabı doğrudur.
nawfal

40
Bu çalışır, ancak mysql sunucusunu yeniden başlattığınızda varsayılanlar geri yüklenir ... neden? kalıcı bir çözüm var mı? Teşekkürler!
Vincent Pazeller

52
Soruma cevap vermek için (kalıcı çözüm): sql_mode açıklamasını bir my.cnf dosyasına (örneğin /etc/my.cnf) koymalı ve sunucuyu yeniden başlatmalısınız. Örneğin, ([mysqld] bölümünün altına) 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
GLOBALbenim için işe yaramadı, ama işe SESSIONyaradı. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre

371

Güncelleme:

resim açıklamasını buraya girin

Geçerli mysql ayarlarınızı korumak ve devre dışı bırakmak ONLY_FULL_GROUP_BYiçin phpmyadmin veya kullandığınız herhangi bir istemciyi ziyaret etmenizi ve şunu yazın:

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

sonraki kopya sonucu my.ini dosyanıza .

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

ubuntu 16 ve üstü :sudo nano /etc/mysql/my.cnf

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

Dikkat! copy_mesonuç, varsayılan olarak kırpılabilen uzun bir metin içerebilir. Metnin tamamını kopyaladığınızdan emin olun!


eski cevap:

Eğer devre dışı istiyorsanız kalıcı "hata SEÇ listesinin İfade #N GRUBU TARAFINDAN maddede değil ve GRUP TARAFINDAN fıkrada sütunlarda işlevsel bağlı değildir nonaggregated sütunu 'db.table.COL' içerir, bu sql_mode = only_full_group_by ile uyumsuz "şu adımları uygulayın:

  1. sudo nano /etc/mysql/my.cnf
  2. Bunu dosyanın sonuna ekle

    [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'i yeniden başlatmak için

Bu, TÜM kullanıcılar ONLY_FULL_GROUP_BYiçin devre dışı bırakılacak


2
benim için, aynı satırda mysqld etiketi ayarlamak işe yaramadı, ama bir satır sonu ile
çalıştı

23
/etc/mysql/mysql.conf.d/mysqld.cnf
Ubuntu için

5
Bu Ubuntu 16.04 (14 ila 16 yükseltme woes ..) için çalıştı. /Etc/mysql/my.cnf doğru dosyadır. Knb tarafından belirtilen dosya bu my.cnf dosyasına en azından 16.04'te eklenmiştir (yapılandırma artık birden çok dosyaya bölünmüştür).
jwinn

2
"SELECT @@ sql_mode;" kullanın değişiklik yapmadan önce hangi modların açık olduğunu görmek için.
Zbigniew Ledwoń

1
göreceğiniz gerçek yer [mysqld]bu dosyada olmayabilir, bir içerme dizininde olabilir. Önce bu komutu kullanın: grep -R "\[mysqld\]" *orada ne olduğunu görmek için - ve bu konuda deneyingrep -R "\bsql_mode\b" *
Oliver Williams

203

Kullanırken dikkatli olun

SET sql_mode = '' 

Bu aslında etkin durumda olan tüm modları siler. Diğer ayarlarla uğraşmak istemiyorsanız,

SELECT @@sql_mode 

ilk olarak, etkinleştirilmiş modların virgülle ayrılmış bir listesini almak için, ONLY_FULL_GROUP_BYseçeneği olmadan bu listeye ayarlayın .


Bunu yapmanın en iyi yolu nedir then SET it to this list without the ONLY_FULL_GROUP_BY option.?
Kevin Meredith

4
@KevinMeredith Dokümanlarımı okuduğumda , bir seferde bir modu açıp kapatmanın bir yolu yok - tüm örnekler, istediklerinizin virgülle ayrılmış bir listesini sağlamanızı gerektirir - örneğinSET 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
Bu kalıcı bir değişiklikse, my.cnf dosyasını aşağıdaki gibi bir satırla düzenleyin: sql_mode=<comma-separated-list>ardından sunucunuzu durdurup başlatın. My.cnf dosyasının yeri ve en iyi düzenleme yolu için işletim sisteminizin belgelerini izleyin.
blackwood

107

Bunu deneyin:

SET sql_mode = ''

Topluluk Not: Aşağıdaki yanıtlarda belirtildiği gibi, bu aslında etkin olan tüm SQL modlarını temizler . İstediğiniz bu olmayabilir.


11
Vay canına, ''= 'full group by is disabled'? MySQL bazı aptalca şeyler yapar ama bu orada.
Aaron Bertrand

38
Bunun temelde herhangi bir sql modunu devre dışı bıraktığını düşünüyorum;
ZviBar

Bu benim için işe yaramadı. Görüyorum 0 rows affectedve sorgum hala çalışmıyor:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber

10
Bu yanıtı denemeden önce kesinlikle Machavity'nin uyarısına bakın ve değişikliklerin devam etmesini istiyorsanız komutta kullandığınızdanglobal emin olun .
thomas88wp

6
Bir süre sonra MySql'e geri döndüğümde, her zaman beni rahatsız eden bu problemle karşılaşıyorum, çünkü her zaman sorunun ne olduğunu unutuyorum :) Duygu sadece hayal kırıklığı yaratıyor, çalıştığını düşündüğünüzde ve şimdi değil sürüm değişikliği nedeniyle.
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;

@ RémiBreton: ur mysql sürümü nedir?
WeiYuan

6
Bu gerçekten işe yarıyor. Ancak sistemimi yeniden başlattıktan sonra (ubuntu 16.04), sql_modeönceki değere geri dönüş. Şimdi ne yapabilirim?
pktangyue

harika, benim için çalıştı, sadece kalıcı olarak bunu dönüştürmek gerekir
Fernando Torres

74

Mevcut modları kaldırmadan sql_mode'a yalnızca bir mod ekleme:

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

Başkalarını kaldırmadan yalnızca belirli bir modu sql_mode'dan kaldırma:

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

Sizin durumunuzda, yalnızca ONLY_FULL_GROUP_BYmodu kaldırmak istiyorsanız , aşağıdaki komutu kullanın:

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

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


Bu harika bir cevap! Teşekkürler.
wedi

1
Bu küresel mi yoksa şu anki bağlantıda mı? Mükemmel cevap!
Oliver M Grech

48

@Cwhisperer sayesinde. Aynı sorunu bir Symfony uygulamasında doktrin ile yaşadım. Ben sadece benim config.yml seçeneği ekledi:

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

Bu benim için iyi çalıştı.


1
Ve SET NAMES 'utf8' ile birleştirmeniz gerekirse "SET NAMES 'utf8", sql_mode = (SELECT REPLACE (@@ sql_mode,' ONLY_FULL_GROUP_BY ',' ')); "; Bunun yerine "SET NAMES 'utf8'; SET sql_mod ..." gibi iki sorgu kullanılırsa "Genel hata: 2014 Diğer arabelleklenmemiş sorgular etkinken sorgular yürütülemez."
Ventzy Kunev

@VentzyKunev lütfen bu öneriyi takip etmeyin ve SET NAMESbu yöntemi kullanarak ayarlamayın , çoğu durumda sytrfony zaten gerekli değildir doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html ve PDO dns ile düzgün yapar, SET NAMES bunu yapmak için modası geçmiş bir yol, 5.3'ten büyük PHP sürümü için kullanılmamalıdır
LPodolski

39

Açık:

  • Ubuntu 14.04
  • mysql Ver 14.14 EditLine sarmalayıcı kullanarak Linux (x86_64) için 5.7.16 dağıtın

Yapmak:

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

Kopyala ve yapıştır:

[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

Dosyanın altına

$ sudo service mysql restart

Mysql.cnf dosyasının hiçbir zaman mysql güncellemesi tarafından üzerine yazılmaz mı?
cwhisperer

1
@cwhisperer /etc/mysql/mysql.cnf2 yapılandırma klasörünü !includedir /etc/mysql/conf.d/+ işaret eder !includedir /etc/mysql/mysql.conf.d/. Aynı şey geçerli /etc/mysql/my.cnf. Bu nedenle, yapılandırma dosyalarının güncelleme sırasında geçersiz kılınmadığını varsayıyorum. Daha fazla http://dev.mysql.com/doc/mysql/en/server-system-variables.html
bilgiyi

Bunu denedim ve Ubuntu 18.04.2 biyonik üzerinde çalışmadı. Bunu takip ettim ve işe yaradı: sitepoint.com/… - belki bu formatı boşluklar ve tırnak işaretleri ile kullanmak önemlidir: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"belki de bunun /etc/mysql/mysql.conf.d/mysqld_mode.cnfyerine yeni bir dosya oluşturmak önemlidir
rubo77

Bu mysql sunucusu yeniden başlatıldıktan sonra bile çalışır
Akshay Khale

36

@Eyo Okon Eyo çözümünün MySQL sunucusu yeniden başlatılmadığı sürece çalıştığını fark ettim, sonra varsayılan ayarlar geri yüklendi. İşte benim için çalışan kalıcı bir çözüm:

Belirli SQL modunu kaldırmak için (bu durumda ONLY_FULL_GROUP_BY ), geçerli SQL modunu bulun:

SELECT @@GLOBAL.sql_mode;

sonucu kopyalayın ve ihtiyacınız olmayanı kaldırın ( ONLY_FULL_GROUP_BY )

Örneğin:

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

için

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

bu dosyayı oluştur ve aç:

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

ve yeni SQL modunuzu yazın ve yapıştırın:

[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'i yeniden başlat:

sudo service mysql restart

Veya ANY_VALUE()ONLY_FULL_GROUP_BY değer reddini bastırmak için kullanabilirsiniz , buradan daha fazla bilgi edinebilirsiniz


3
YukarıANY_VALUE()
Sithu

25

MySQL dokümantasyon da aşağıdaki yöntemleri belirtir:

  • sql-mode="<modes>"My.cnf (Unix işletim sistemleri) veya my.ini (Windows) gibi bir seçenek dosyasında ayarlayın .
  • SQL modunu komut satırından sunucu başlangıcında ayarlamak için --sql-mode="<modes>"seçeneği kullanın.

* <modes>Virgülle ayrılmış farklı modların listesi nerede .

SQL modunu açıkça temizlemek için --sql-mode=""komut satırında veya sql-mode=""bir seçenek dosyasında kullanarak boş bir dizeye ayarlayın .

sql-mode=""Seçeneği ekledim /etc/my.cnfve işe yaradı.

Bu SO çözümü , MySQL tarafından hangi my.cnf dosyasının kullanıldığını bulmanın yollarını tartışır.

Değişiklik yaptıktan sonra MySQL'i yeniden başlatmayı unutmayın.


1
bu benim için doğru cevap `` Ver 14.14 Distrib 5.7.10, osx10.11 (x86_64) için
Sinux

bu doğru cevap olarak işaretlenmelidir. Diğer cevaplar kalıcı bir çözüm sağlamaz.
sijpkes

@ br3nt Geçerli modların ne olduğunu nasıl tespit edebilirim, böylece tüm modları ayarlamak istemediğimde istenmeyen modları kaldırabilirim?
simgineer

1
DeneyinSELECT @@GLOBAL.sql_mode;
br3nt

19

WAMP kullanıyorsanız. WAMP simgesine sol tıklayın, ardından MySQL -> MySQL ayarları -> sql-moduna gidin ve sonra sql-mode-> kullanıcı modunu seçin

Bu resmi kontrol et


WAMP kurulumumda MySQL Ayarlarının olmamasının bir nedeni var mı? Hizmet yönetimi ve MySQL konsolu var ancak ayar yok?
Craig

Tam da aradığım şey buydu! Basit bir WAMP Sunucusu çözümü sağladığınız için teşekkür ederiz! Bu eğitimde #aggregation yapmaya çalışırken buna ihtiyacım vardı: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010 5:18 '

12

Benim sql (Mac OS X üzerinde çalışan sürüm 5.7.11) bu benim için mysql kabuk istemcide çalışır:

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 belgelerine göre, sql_mode varsayılan

5.6.5 sürümünde boş dize ve 5.6.6 sürümünde NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES

mysql 5.6 referansı


Diğer cevaplar sql_mode := ''mümkün olduğunu iddia ediyor. Neden katılmıyorsun?
Hermann Döppes

Dizenizdeki tüm bu seçenekler nereden geliyor? Bunun arkasındaki sebep nedir?
Hermann Döppes

MySQL 5.6 Dokümantasyon göre, sql_mode varsayılan 5.6.6 boş MySQL 5.6.5 dizeyi ve arka NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES olduğunu dev.mysql.com/doc/refman/5.6/en/...
Salvatore Napoli

Teşekkürler benim için Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18, Linux (x86_64) için EditLine sarmalayıcı kullanarak çalıştı
Paul Preibisch

12

MySQL 5.7 ve Ubuntu 16.04 üzerinde mysql.cnf dosyasını düzenleyin.

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

Aşağıdaki gibi sql_mode'u ekleyin ve dosyayı kaydedin.

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

Benim durumumda, STRICT_TRANS_TABLES modunu ve ONLY_FULL_GROUP_BY modunu kaldırdığımı gözlemleyin.

Bunu yaptığınızda, mod yapılandırması kalıcı olarak kaydedilir. @@ sql_mode dosyasını MySQL üzerinden güncellerseniz, makine / servis yeniden başlatıldığında sıfırlanacağı için bu durum farklı olabilir.

Bundan sonra, değiştirilen yapılandırma için harekete geçin, mysql hizmetini yeniden başlatın:

$ sudo service mysql restart

MySQL'e erişmeye çalışın:

$ mysql -u user_name -p

Oturum açıp MySQL konsoluna erişebiliyorsanız sorun yok. Harika!

AMA benim gibi, hatayı yüz ise "bilinmeyen değişken sql_mode" belirtir, sql_mode için bir seçenektir mysqld , tekrar düzenlemek dosya mysql.cnf, geri dönüp değiştirmek zorunda kalacak [mysql]kadar [mysqld]. MySQL hizmetini yeniden başlatın ve MySQL konsolunda oturum açmaya çalışırken son bir test yapın. İşte burada!


1
@ Alexandre-ribeiro sayesinde oturumda ayarlamak daha yukarıda bahsedilen yaklaşım şiddetle tavsiye ediyorum. Ubuntu 16.04 ve MySQL 5.7.x, düzenlemeyi daha iyi dosya varsa ve girmek olanlar için ini yönergesi sql_mode = <modlar> altında [mysqld] karşı bildirerek olarak grubun, [mysql] Tecrübelerime göre değil, çalışır.
codarrior

MySQL 5.7.22 sürümüne sahibim. Bu garip, ama bunun çalışması için yukarıda gösterildiği gibi my.cnf'deki sql_mode bildiriminden hem STRICT_TRANS_TABLES hem de ONLY_FULL_GROUP_BY'yi kaldırmak zorunda kaldım . Gerçekte, sadece ONLY_FULL_GROUP_BY modunu kaldırmak istiyorum. Eğer "set global / session sql_mode = ..." yaparsam çalışmak için STRICT_TRANS_TABLES kaldırmak zorunda kalmadan sadece ONLY_FULL_GROUP_BY kaldırabilirim. Ama bu hayatta kalmayacağından yeniden başlar, bu yüzden benim için fazla bir faydası yok.
RayCh

12

Mysql tezgahında düzeltmek için yaptığım şey bu:

Aşağıdaki değeri aşağıdaki komutla almadan önce

SELECT @@sql_mode 

daha sonra ONLY_FULL_GROUP_BY anahtarını listeden kaldırdım ve aşağıdaki komutu yapıştırdım

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 için (10.14) Açık 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

Aşağıdaki yapıştırın:

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

Kaydet ve Çık nano ShortKeys: Ctrl+xve yveEnter

Not:mysql-5.7.24-macos10.14-x86_64 Bu komutlardagüncellemeniz gerekebilir, içine girdiğiniz doğru klasör adını kontrol edin/usr/local/

Umarım birine yardım eder!


10

Modları ekle veya kaldır sql_mode

MySQL 5.7.9 veya üstü

Bir mod eklemek veya moddan bir mod kaldırmak sql_modeiçin list_addve list_dropişlevlerini kullanabilirsiniz .

Geçerli moddan bir modu kaldırmak SESSION.sql_modeiçin aşağıdakilerden birini kullanabilirsiniz:

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_modeGeçerli yeniden çalışma işlemi için devam eden moddan hizmet yeniden başlatılana kadar bir modu kaldırmak için .

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

MySQL 5.7.8 veya öncesi

Yana sql_modedeğer modlarının bir CSV dizesi, sen dize kullanarak gerçekleştirilebilir kalıntı virgül, içermediğinden emin gerekir TRIM(BOTH ',' FROM ...).

Bir modu sql_modedeğişkenten kaldırmak için şunu kullanmak istersiniz:REPLACE()TRIM() kalan virgüllerin kaldırıldığından emin olmak birlikte .

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_modeDeğişkene bir mod eklemek için CONCAT_WS(',', ...), geçerli modlara bir virgül eklenmesini veTRIM() virgül eklenmesini kalan virgüllerin kaldırılmasını .

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

NOT: GLOBAL değişkeni yok değil yaymakSESSION yeni bir bağlantı kurulana kadar, değişken.

GLOBALÇalışan hizmet yeniden başlatılıncaya kadar değişken devam edecektir.

SESSIONBağlantı kapalı ve yeni bir bağlantı kurulana kadar değişken akım bağlantısı için devam edecektir.


Geri dön GLOBAL.sql_mode

Yana SET sql_mode = 'ONLY_FULL_GROUP_BY';olmadan çalıştırıldı GLOBALmodifiye değişim, sadece mevcut etkilenen SESSIONde ilgilidir durum değeri, @@sql_mode. Kaldırmak ve sunucu yeniden başlatma değerinde genel varsayılana dönmek için, değerini kullanmak istersiniz @@GLOBAL.sql_mode. [sic]

Geçerli SESSIONdeğer yalnızca geçerli bağlantı için geçerlidir. Sunucuya yeniden bağlanmak, değeri sunucuya geri döndürür.GLOBAL .

Geçerli oturum durumu değerini geçerli genel değere döndürmek için aşağıdakilerden birini kullanabilirsiniz:

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

SESSION.sql_modeDeğeri olarak değiştirONLY_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 |
+--------------------+----------------------------------------------+

Döndür SESSION.sql_modedeğer GLOBAL.sql_modedeğeri

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

Sunucuyu Yeniden Başlatma Kalıcı sql_mode

Sunucu başlangıcında SQL modunu ayarlamak için --sql-mode="modes", komut satırındaki veya sql-mode="modes"my.cnf (Unix işletim sistemleri) veya my.ini (Windows) gibi bir seçenek dosyasındaki seçeneği kullanın. [sic]

Desteklenen ve varsayılan modları belirlemek için lütfen MySQL sürümünüze bakın .

[mysqld]

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

Varsayılan sql_modedeğerler

MySQL sürüm başına dokümantasyon değerleri kaldırıldığından referans için buraya ekledim.

MySQL> = 8.0.11 8.0.5 - 8.0.10 Atlandı

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 kullanıyorsanız, 'NO_AUTO_CREATE_USER' yazılımını sql modundan kaldırmanız gerekir.

Dosyaya /etc/mysql/my.cnfve [mysqld] üstbilgisine aşağıdaki satırı ekleyin

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

şu ana kadar bu cevap 8.0.13
tomexsans

7

Ben doktrin kullanıyorum ve benim doctrine.local.php içinde driverOptions ekledim:

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 içinde kullanıcının ayrıcalıklarda SUPER etkinleştirilmiş olması gerekir.


3
Doktrini yapılandırmak için yaml gösterimini kullanarak (Symfony'de yapıldığı gibi) sabit "PDO :: MYSQL_ATTR_INIT_COMMAND" yerine "1002" kullanmanız gerekir, ancak yine de bu birkaç hafta önce aradığım ve bulamadığım şeydi dışarı. Çözümünüz için teşekkürler! Benim için çalıştı.
Arvid

5

CPanel / WHM ile bir VPS / Sunucu çalıştıran kime , ONLY_FULL_GROUP_BY öğesini kalıcı olarak devre dışı bırakmak için aşağıdakileri yapabilirsiniz

Kök erişimine ihtiyacınız var (bir VPS veya özel sunucuda)

  1. Kök olarak WHM girin ve phpMyAdmin'i çalıştırın

  2. Değişkenler'i tıklayın, arayın sql_mode, 'Düzenle'yi tıklayın ve bu metin kutusundaki tüm satırı kopyalayın

örneğin bunu kopyalayın:

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 (kök) üzerinden sunucunuza bağlanın ve dosyayı indirin /etc/my.cnf

  2. my.cnfYerel PC'nizde bir metin düzenleyici dosyası ile açın ve [mysqld]adım (2) 'de kopyaladığınız tüm satırı ( bölümün altına ) yapıştırın ancak kaldırınONLY_FULL_GROUP_BY,

örneğin bunu yapıştırın:

# 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. Dosyayı kaydedin my.cnfve tekrar yükleyin/etc/

  2. WHM girin ve "WHM> Hizmetleri Yeniden Başlat> SQL Server (MySQL)" seçeneğine gidin ve hizmeti yeniden başlatın


4

Im mysql ile çalışma ve kök kullanıcı ile kayıtlı, benim için çalışan çözüm aşağıdaki gibidir:

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


3

Bu Ubuntu 14+ üzerinde MySql 5.7+ için kalıcı bir çözümdür:

$ 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

Hatasız giriş yapabiliyorsanız, şimdi ayarlanmış olmalısınız.


1

Yapılandırma dosyasını kullanarak devre dışı bırakabilirsiniz my.cnf:

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

Yani macOS 10.12'de usr/local/etc/my.cnf. sql_modeBurada düzenleyebilirsiniz :

# 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

İşte benim çözüm phpmyadmin pano üzerinden Mysql yapılandırmasını değiştirme:

"Bu, sql_mode = only_full_group_by ile uyumsuz" düzeltmek için: phpmyadmin'i açın ve Ana Sayfa'ya gidin ve 'Değişkenler' alt menüsünü seçin. SQL modunu bulmak için aşağı kaydırın. SQL modunu düzenleyin ve 'ONLY_FULL_GROUP_BY' öğesini kaldırın.


0

MySQL sürüm 5.7.28 ile kontrol edin
SELECT @@sql_mode; ve

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.