Отключить только полную группу по

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

SET sql_mode = 'ONLY_FULL_GROUP_BY';

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

18 ответов


Решение 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

обновление:

enter image description here

чтобы сохранить текущие настройки mysql и отключить ONLY_FULL_GROUP_BY Я предлагаю посетить ваш phpmyadmin или любой клиент, который вы используете, и введите:

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

следующий результат копирования на ваш .

монетный: 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 списка выбора не находится в предложении GROUP BY и содержит неагрегированный столбец " db.таблица.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 на все пользователи


будьте осторожны при использовании

SET sql_mode = '' 

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

SELECT @@sql_mode 

во-первых, чтобы получить разделенный запятыми список из режимов включен, а затем установить его в этот список без .


попробуйте:

SET sql_mode = ''

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


    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;

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


благодаря @cwhisperer. У меня была такая же проблема с Doctrine в приложении Symfony. Я просто добавил опцию в свою конфигурацию.в формате YML:

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

это отлично сработало для меня.


на документация MySQL также указывает следующие методы:

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

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

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

добавил до /etc/my.cnf и это сработало.

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

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


On:

  • Ubuntu 14.04
  • MySQL-сервера версия 14.14 дистриб 5.7.16, для Linux (x86_64 с), используя EditLine фантик

Do:

$ 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

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

Checkout this image


я заметил, что решение @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

to

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


на моем sql (версия 5.7.11 работает на Mac OS X) эта работа для меня на mysql shell client:

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 ссылка


на 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. Вот она!


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


Если вы используете MySQL 8.0.11 so, вам нужно удалить "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

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

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


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

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

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