Отключить ONLY_FULL_GROUP_BY

615

Я случайно включил режим ONLY_FULL_GROUP_BY следующим образом:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Как мне это отключить?

ZviBar
источник
39
Ты пробовал SET sql_mode = ''?
Трипп Кинетикс
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 и нажмите «Сохранить». введите описание изображения здесь
Эйо Окон Эйо
источник
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

Убунту 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для ВСЕХ пользователей

breq
источник
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 (конфигурация теперь разделена на несколько файлов).
Джвинн
2
Используйте "SELECT @@ sql_mode;" чтобы увидеть, какие режимы в настоящее время включены, прежде чем вносить изменения.
Збигнев Ledwoń
1
фактическое место, где вы увидите, [mysqld]может отсутствовать в этом файле, оно может быть в каталоге include. Сначала используйте эту команду: 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.
Блэквуд
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 ...
Макс Хейбер
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;
Weiyuan
источник
@ RémiBreton: какая у тебя версия mysql?
ВэйЮань
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. У меня была такая же проблема с Doctrine в приложении 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 = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Если вместо этого используются два запроса, такие как «SET NAMES 'utf8'; SET sql_mod ...», будет выдано «Общая ошибка: 2014 г. Невозможно выполнить запросы, пока активны другие небуферизованные запросы».
Венцы Кунев
@VentzyKunev, пожалуйста, не следуйте этому совету и не устанавливайте SET NAMESс помощью этого метода, в большинстве случаев не требуется, чтобы symfony уже установил его через doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html и делает это правильно через PDO dns, SET NAMES - это устаревший способ сделать это, который не должен использоваться для версии PHP выше 5.3
LPodolski
39

На:

  • Убунту 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
Jadeye
источник
Будет ли mysql.cnf никогда не перезаписываться обновлением mysql?
шепот
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
Акшай Хале
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, вы можете прочитать больше об этом здесь

Waqleh
источник
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-mode=""опцию, /etc/my.cnfи она сработала.

В этом SO-решении обсуждаются способы выяснить, какой файл my.cnf используется MySQL.

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

br3nt
источник
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-mode и затем выберите sql-mode-> user mode

Оформить заказ

Ширан Габриэль
источник
Есть ли причина, по которой у меня нет настроек MySQL в моей установке WAMP? Есть служба администрирования и консоль MySQL, но нет настроек?
Крейг
Это именно то, что я искал! Спасибо за предоставление простого решения WAMP Server! Я нуждался в этом, пытаясь выполнить #aggregation в этом учебном пособии: youtu.be/HXV3zeQKqGY?t=9718
Эрик Хепперл - 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 := ''что это возможно. Почему ты не согласен?
Герман Деппес
Откуда все эти опции в вашей строке? В чем причина этого?
Герман Деппес
Согласно документации 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
Пол 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.

Делая это, он сохранит конфигурацию режима навсегда. Иначе, если вы просто обновите @@ sql_mode через MySQL, потому что он будет сброшен при перезапуске машины / службы.

После этого, чтобы измененная конфигурация начала действовать, перезапустите службу mysql:

$ sudo service mysql restart

Попробуйте получить доступ к MySQL:

$ mysql -u user_name -p

Если вы можете войти и получить доступ к консоли MySQL, это нормально. Большой!

НО , если , как я, вы сталкиваетесь ошибка «неизвестная переменная sql_mode» , что указывает на sql_mode вариант для туздЫ , вам придется снова вернуться, редактировать файл mysql.cnf и изменить [mysql]к [mysqld]. Перезапустите службу MySQL и выполните последний тест, пытаясь войти в консоль MySQL. Вот!

Александр Рибейро
источник
1
Я бы настоятельно рекомендовал вышеупомянутый подход, чем устанавливать его на сессии, благодаря @ alexandre-ribeiro. Для тех, у кого есть Ubuntu 16.04 и mysql 5.7.x, лучше отредактируйте файл и введите директиву ini sql_mode = <mode> в группе [mysqld] , так как объявление против [mysql] не работает, согласно моему опыту.
codarrior
У меня MySQL 5.7.22. Это странно, но я должен был удалить как STRICT_TRANS_TABLES и ONLY_FULL_GROUP_BY из декларации sql_mode в my.cnf, как показано выше, для этого к работе. На самом деле я хочу удалить только режим ONLY_FULL_GROUP_BY. Если я сделаю «set 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'
Мэтт Вегас
источник
11

Добавить или удалить режимы 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

''
fyrye
источник
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/

Надеюсь, это поможет кому-то!

AamirR
источник
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, и я добавил driverOptions в мой 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 в привилегиях.

cwhisperer
источник
3
Используя нотацию yaml для настройки Doctrine (как в Symfony), вам нужно использовать «1002» вместо константы «PDO :: MYSQL_ATTR_INIT_COMMAND», но, тем не менее, это то, что я искал несколько недель назад и не смог найти вне. Спасибо за ваше решение! Работал на меня.
Арвид
5

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

Вам нужен root-доступ (на 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

Если вы можете войти без ошибок - у вас все должно быть настроено.

demisx
источник
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 и перейдите на домашнюю страницу и выберите подменю «Variables». Прокрутите вниз, чтобы найти режим 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'
Картик
источник