Отключить ONLY_FULL_GROUP_BY

378

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

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Как отключить его?

  • 30
    Вы пробовали SET sql_mode = '' ?
  • 0
    Оно работает! Вы можете опубликовать это как ответ.
Показать ещё 9 комментариев
Теги:
mysql-workbench

20 ответов

769
Лучший ответ

Решение 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 и нажать "Сохранить". Изображение 832
  • 11
    Это решение отлично работает на MySQL 5.7.11 и должно быть принято. Принятый ответ не работает на новой версии MySQL
  • 1
    Разве не должно быть запятой как часть поиска? 'ONLY_FULL_GROUP_BY,',''
Показать ещё 24 комментария
293

Обновить:

Изображение 833

Чтобы сохранить текущие настройки 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 на той же строке не работает, но работает с разрывом строки :) спасибо
  • 17
    Для Ubuntu файл, в который попадают пользовательские значения конфигурации, является /etc/mysql/mysql.conf.d/mysqld.cnf
Показать ещё 8 комментариев
176

Будьте осторожны, используя

SET sql_mode = '' 

Это фактически очищает все поддерживаемые режимы. Если вы не хотите связываться с другими настройками, вам нужно сделать

SELECT @@sql_mode 

сначала, чтобы получить список разрешенных разделов с запятыми, затем установите его в этот список без опции ONLY_FULL_GROUP_BY.

  • 0
    Каков наилучший способ сделать это: then SET it to this list without the ONLY_FULL_GROUP_BY option. ?
  • 3
    @KevinMered с моим чтением документов , нет никакого способа включить / выключить один режим за раз - все примеры требуют, чтобы вы 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'; разделенный запятыми список тех, которые вы хотите - например, 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 комментарий
94
    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;
  • 11
    SET GLOBAL ... действительно сделал работу для меня здесь.
  • 0
    @ RémiBreton: какая у тебя версия mysql?
Показать ещё 4 комментария
88

Попробуйте:

SET sql_mode = ''

Примечание сообщества. Как указано в ответах ниже, это фактически очищает все режимы SQL, которые в настоящее время включены. Возможно, это не обязательно то, что вы хотите.

  • 11
    Вау, '' = 'full group by is disabled' ? MySQL делает некоторые довольно глупые вещи, но этот наверху.
  • 32
    Я думаю, что это в основном отключает любой режим sql;
Показать ещё 16 комментариев
52

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

38

Благодаря @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 г. Невозможно выполнить запросы, пока активны другие небуферизованные запросы».
  • 0
    Спасибо, это работает на меня! (symfony 4.2)
27

О:

  • Ubuntu 14.04
  • mysql Ver 14.14. Распространение 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
  • 0
    Будет ли 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
Показать ещё 1 комментарий
23

Документация по 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)`
  • 0
    это должно быть отмечено правильный ответ. Другие ответы не дают постоянного решения.
19

Я заметил, что решение @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 отклонения значения, вы можете узнать больше об этом здесь

  • 0
    Вверх для ANY_VALUE()
18

Если вы используете WAMP. Щелкните левой кнопкой мыши по значку WAMP, затем перейдите в MySQL → Настройки MySQL → sql-mode и затем выберите режим sql-mode- > user

Изображение 834

  • 0
    Есть ли причина, по которой у меня нет настроек MySQL в моей установке WAMP? Есть служба администрирования и консоль MySQL, но нет настроек?
  • 0
    Это именно то, что я искал! Спасибо за предоставление простого решения WAMP Server! Мне это нужно было при попытке выполнить #aggregation в этом уроке: youtu.be/HXV3zeQKqGY?t=9718
9

В 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, потому что он будет reset при перезагрузке машины/службы.

После этого, чтобы модифицированная конфигурация приняла действие, перезапустите службу 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 = <mode> в группе [mysqld] , так как объявление против [mysql] не работает, согласно моему опыту.
  • 0
    У меня 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, чтобы он работал. Но поскольку это не выживает, перезапускается, так что это не очень полезно для меня.
9

В моем 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

  • 0
    Другие ответы утверждают, что sql_mode := '' возможно. Почему ты не согласен?
  • 0
    Откуда все эти опции в вашей строке? В чем причина этого?
Показать ещё 3 комментария
5

Я использую доктрину, и я добавил 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 в привилегиях.

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

Если вы используете MySQL 8.0.11, вам необходимо удалить NO_AUTO_CREATE_USER 'из sql-mode.

Добавьте следующую строку в файл /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
  • 0
    пока этот ответ работает для 8.0.13
2

Это постоянное решение для 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

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

0

Вот что я выполнил, чтобы исправить на 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'
0

Для кого работает 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)" и перезапустите службу

0

Вот мое решение, изменяющее конфигурацию Mysql через панель управления phpmyadmin:

Чтобы исправить "это несовместимо с sql_mode = only_full_group_by": Откройте phpmyadmin и перейдите на главную страницу и выберите подменю "Переменные". Прокрутите вниз, чтобы найти режим sql. Измените режим sql и удалите 'ONLY_FULL_GROUP_BY' Сохраните его.

0

Вы можете отключить его, используя конфигурационный файл 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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню