Вимкнути ONLY_FULL_GROUP_BY


614

Я випадково ввімкнув режим ONLY_FULL_GROUP_BY таким чином:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Як його відключити?


38
Ви пробували SET sql_mode = ''?
Tripp Kinetics

4
Чому ви хочете відключити режим, який змушує MySQL краще відповідати стандартам SQL, і той, який також вчить бути більш уважними в написанні запитів?
Андрій М

34
Станом на Mysql 5.7 ви, можливо, використовуєте функцію ANY_VALUE ( column) для зміни вашого запиту. Дивіться тут
Qoheleth-Tech

3
@AndriyM Мені доведеться скоріше використовувати це, оскільки я переношу цілий набір старих програм на новий сервер, і вони повинні працювати, незалежно від того, маю я джерело чи ні.
Джейді

8
@AndriyM Тому що, якщо я групуюсь за унікальним стовпчиком індексу, я ВЖЕ знаю, що кожен рядок буде унікальним - додаючи окрему групу за командою для кожного. неодружений стовпчик. в столі - королівський біль.
Benubird

Відповіді:


1163

Рішення 1: Видаліть ONLY_FULL_GROUP_BY з консолі mysql

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

Ви можете прочитати більше тут

Рішення 2: Видаліть ONLY_FULL_GROUP_BY з phpmyadmin

  • Відкрийте phpmyadmin та виберіть localhost
  • Клацніть на меню Змінні та прокрутіть вниз для режиму sql
  • Натисніть кнопку редагування, щоб змінити значення та видалити ONLY_FULL_GROUP_BY та натисніть кнопку "Зберегти". enter image description here

12
Це рішення добре працює на mySQL 5.7.11 і має бути прийнятим. Прийнята відповідь не працює на новій версії mySQL
Anyone_ph

4
Просто забезпечено. Не має значення REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL все одно видаляє із запису небажані коми. Відповідь ОП правильна.
nawfal

40
Це працює, але коли я перезавантажую сервер mysql, параметри за замовчуванням відновлюються ... чому? чи є стійке рішення? Дякую!
Вінсент Пазеллер

52
Щоб відповісти на моє запитання (стійке рішення): потрібно помістити опис sql_mode всередині файлу my.cnf (наприклад, /etc/my.cnf) та перезапустити сервер. Наприклад, вставка (нижче в розділі [туздИ]) sql_mode = "STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Вінсент Pazeller

21
GLOBALне працював для мене, але SESSIONробив. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Андре

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Результат може містити довгий текст, який може бути оброблений за замовчуванням. Обов’язково скопіюйте весь текст!


стара відповідь:

Якщо ви хочете остаточно відключити помилку " Вираз №N у списку SELECT відсутній у пункті GROUP BY і містить неагрегований стовпець" db.table.COL ", який функціонально не залежить від стовпців у пункті GROUP BY; це несумісно з 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, включений до цього файлу my.cnf, принаймні, 16.04 (конфігурація тепер розділена на кілька файлів).
jwinn

2
Використовуйте "SELECT @@ sql_mode;" щоб побачити, які режими ввімкнено перед внесенням змін.
Zbigniew Ledwoń

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, коли я читаю документи , немає ніякого способу вмикати / вимикати один режим одночасно - усі приклади вимагають, щоб ви ввели список, відокремлений комами, з тих, що ви хочете - наприклад,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.
blackwood

107

Спробуйте:

SET sql_mode = ''

Примітка спільноти: Як зазначено у відповідях нижче, це фактично очищує всі включені в даний час режими SQL. Це не обов'язково може бути тим, що ви хочете.


11
Нічого собі, ''= 'full group by is disabled'? MySQL робить деякі дуже німі речі, але ця є там.
Аарон Бертран

38
Я думаю, що це в основному вимикає будь-який режим sql;
ZviBar

Це не спрацювало для мене. Я бачу, 0 rows affectedі мій запит все ще не працює:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber

10
Перш ніж спробувати цю відповідь, обов'язково подивіться на попередження Machavity, і якщо ви хочете, щоб зміни зберігалися, обов'язково використовуйте globalв команді .
thomas88wp

6
Кожен раз, коли через деякий час я повертаюся до MySql, я завжди стикаюся з цією проблемою, яка мене дратує, тому що я завжди забуваю, у чому проблема :) Почуття просто розчаровує, коли ти думаєш, що воно працювало, а тепер це не так через зміну версії.
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?
WeiYuan

6
Це справді працює. Але після перезавантаження системи (ubuntu 16.04) sql_modeвідкат до попереднього значення. Що я можу зробити зараз?
pktangyue

приголомшливий, працював для мене, просто мені потрібно конвертувати це на постійній основі
Фернандо Торрес

74

Додавання лише одного режиму до sql_mode без видалення існуючого:

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
Це глобальне чи поточне з'єднання? Чудова відповідь!
Олівер М Греч

48

Дякуємо @cwhisperer. У мене була така ж проблема з доктриною в додатку Symfony. Щойно я додав параметр до свого 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 = (ВИБІРТИ ЗАМОВИТИ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Якщо замість цього використовуються два запити, як-от "SET NAMES 'utf8'; SET sql_mod ...", це призведе до "Загальної помилки: 2014 Неможливо виконати запити, тоді як інші небуферні запити активні".
Венці Кунев

@VentzyKunev, будь ласка, не слідкуйте за цією порадою і не встановлюйте SET NAMESцей метод, у більшості випадків це не потрібно. Симфонія вже встановлена ​​?? через doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , і чи правильно це через PDO dns, SET NAMES застарілий спосіб зробити це, що не слід використовувати для PHP версії, що перевищує 5,3
LPodolski

39

Увімкнено:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16, для Linux (x86_64), використовуючи обгортку EditLine

Зробіть:

$ 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

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
Up forANY_VALUE()
Sithu

25

Документація MySQL також визначає такі методи:

  • Встановіть sql-mode="<modes>"у файлі опцій, такі як my.cnf (операційні системи Unix) або my.ini (Windows).
  • Щоб встановити режим SQL при запуску сервера за допомогою командного рядка, скористайтеся --sql-mode="<modes>"опцією.

* Де <modes>знаходиться список різних режимів, розділених комами.

Щоб явно очистити режим SQL, встановіть його в порожній рядок за --sql-mode=""допомогою командного рядка або sql-mode=""у файлі опцій.

Я додав sql-mode=""варіант /etc/my.cnfі він спрацював.

Це рішення SO обговорює способи з'ясувати, який файл my.cnf використовується MySQL.

Не забудьте перезапустити MySQL після внесення змін.


1
це правильна відповідь для мене `Ver 14.14 Distrib 5.7.10, для osx10.11 (x86_64)`
Sinux

це має бути позначено правильною відповіддю. Інші відповіді не дають постійного рішення.
sijpkes

@ br3nt Як визначити, які використовуються поточні режими, щоб я міг просто видалити небажані режими, якщо я не хочу зняти всі режими?
simgineer

1
СпробуйтеSELECT @@GLOBAL.sql_mode;
br3nt

19

Якщо ви використовуєте WAMP. Клацніть лівою кнопкою миші на значку WAMP, потім перейдіть на MySQL -> Налаштування MySQL -> режим sql, а потім виберіть режим sql-> користувальницький режим

Оформити замовлення на це зображення


Чи є причина, що у мене не встановлено налаштування MySQL у моєму WAMP? Є адміністрування служби та консоль MySQL, але немає налаштувань?
Крейг

Це саме те, що я шукав! Дякуємо за надання простого сервера WAMP Server! Мені це було потрібно, намагаючись зробити #aggregation у цьому підручнику: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010

12

У моєму sql (версія 5.7.11, що працює на Mac OS X) ця робота для мене на клієнті оболонки 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 та назад NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES у 5.6.6 +

mysql 5.6 посилання


Інші відповіді стверджують, sql_mode := ''що це можливо. Чому ви не згодні?
Hermann Döppes

Звідки беруться всі ці варіанти у рядку? Які міркування за цим?
Герман Дьоппес

Згідно з документацією MySQL 5.6, sql_mode за замовчуванням - це порожній рядок у MySQL 5.6.5 та назад NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES в 5.6.6 dev.mysql.com/doc/refman/5.6/en/…
Сальваторе Наполі

Спасибі працювали для мене на Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18, для Linux (x86_64), використовуючи обгортку EditLine
Пол Прейбіш

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.

Це дозволить зберегти конфігурацію режиму назавжди. Інакше, якщо ви просто оновите @@ sql_mode через MySQL, оскільки він буде скинутий під час перезавантаження машини / служби.

Після цього, щоб змінена конфігурація вступила в дію, перезапустіть службу 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, краще відредагуйте файл та введіть директиву ini sql_mode = <режими> у групу [mysqld] , оскільки заявлення проти [mysql] не працює, згідно з моїм досвідом.
codarrior

У мене MySQL 5.7.22. Це дивно, але мені довелося видалити і STRICT_TRANS_TABLES, і ONLY_FULL_GROUP_BY з декларації sql_mode в my.cnf, як показано вище, щоб це працювало. Насправді я хочу лише зняти режим ONLY_FULL_GROUP_BY. Якщо я встановлю "global / session sql_mode = ...", я можу видалити просто ONLY_FULL_GROUP_BY, не виймаючи STRICT_TRANS_TABLES, щоб він працював. Але оскільки це не переживає перезавантаження, тому мені це не дуже корисно.
RayCh

12

Це те, що я вирішив виправити на Mysql workbench:

Перш ніж я отримав поточне значення за допомогою команди нижче

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) Відкрийте термінал

$ 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

Клавіші для збереження та виходу нано: Ctrl+xі yтаEnter

Примітка. Можливо, вам потрібно буде оновитиmysql-5.7.24-macos10.14-x86_64ці команди, просто перевірте правильну назву папки, до якої ви потрапили/usr/local/

Сподіваюся, це комусь допоможе!


10

Додавання або видалення режимів до 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. [sic]

Поточне 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). [sic]

Будь ласка, перегляньте свою версію 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 так, вам потрібно видалити "NO_AUTO_CREATE_USER" з режиму sql.

Додайте наступний рядок у файл /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.local.php:

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
Використовуючи позначення yaml для налаштування Doctrine (як це робиться в Symfony), вам потрібно використовувати "1002" замість постійної "PDO :: MYSQL_ATTR_INIT_COMMAND", але все-таки це те, що я шукав кілька тижнів тому і не міг знайти з. Дякуємо за ваше рішення! Працювали для мене.
Арвід

5

Для кого працює VPS / сервер з cPanel / WHM , ви можете зробити наступне, щоб остаточно відключити ONLY_FULL_GROUP_BY

Вам потрібен кореневий доступ (або на VPS, або на спеціальному сервері)

  1. Введіть WHM як root та запустіть 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 (root) і завантажте файл /etc/my.cnf

  2. Відкрийте текстовий my.cnfфайл- редактор на локальному ПК та вставте в нього (під [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 = (ВИБІР ЗАМОВЛЕННЯ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));


3

Це постійне рішення для MySql 5.7+ на 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

Якщо ви можете увійти без помилок - вам слід все налаштувати.


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

Ось моє рішення про зміну конфігурації Mysql через інформаційну панель phpmyadmin:

Для того, щоб виправити "це несумісно з 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.