it-swarm.com.ru

Отключить ONLY_FULL_GROUP_BY

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

SET sql_mode = 'ONLY_FULL_GROUP_BY';

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

418
ZviBar

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

Обновление:

 enter image description here

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

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

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

mint: 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 может содержать длинный текст, который может быть обрезан по умолчанию. Убедитесь, что вы скопировали весь текст!


старый ответ:

Если вы хотите отключить навсегда error "Выражение #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 для ВСЕХ пользователей

314
breq

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

SET sql_mode = '' 

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

SELECT @@sql_mode 

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

177
Taran

Попробуйте это:

SET sql_mode = ''

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

93
Tripp Kinetics
    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;
91
WeiYuan

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

56
Janaka R Rajapaksha

Благодаря @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',''))"

Это работало нормально для меня.

38
Arvid

На:

  • Убунту 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
26
Jadeye

Документация 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 после внесения изменений.

22
br3nt

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

20
Waqleh

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

 Checkout this image

18
Shiran Gabriel

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

10
Alexandre Ribeiro

На моем sql (версия 5.7.11, работающая на Mac OS X) это работает для меня на клиенте mysql Shell:

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

9
Salvatore Napoli

Если вы используете 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
5
Hiren Bhut

Я использую 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 в привилегиях.

5
cwhisperer

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

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

2
demisx

Для 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

Горячие клавиши для сохранения и выхода nano: Ctrl+x и y и Enter

Примечание:Вам может потребоваться обновить mysql-5.7.24-macos10.14-x86_64 в этих командах, просто проверьте правильное имя папки, которое вы получили в /usr/local/

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

2
AamirR

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

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

1
Marco Demaio

Я работаю с MySQL и зарегистрирован с пользователем root, решение, которое работает для меня заключается в следующем:

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

0
Jorge Santos Neill

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