Ответ 1
Решение 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
Я случайно включил режим ONLY_FULL_GROUP_BY следующим образом:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Как отключить его?
Решение 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
Чтобы сохранить текущие настройки 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 "делайте эти шаги:
sudo nano/etc/mysql/my.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
Это отключит ONLY_FULL_GROUP_BY
для всех пользователей
Будьте осторожны, используя
SET sql_mode = ''
Это фактически очищает все поддерживаемые режимы. Если вы не хотите связываться с другими настройками, вам нужно сделать
SELECT @@sql_mode
сначала, чтобы получить список разрешенных разделов с запятыми, затем установите его в этот список без опции ONLY_FULL_GROUP_BY
.
Попробуйте:
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. Я просто добавил параметр в свой 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',''))"
Это сработало для меня.
О:
делать:
$ 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 также определяет следующие методы:
sql-mode="<modes>"
в файле параметров, таком как my.cnf(операционные системы Unix) или my.ini(Windows).--sql-mode="<modes>"
.* Где <modes>
- список различных режимов, разделенных запятыми.
Чтобы явно очистить режим SQL, установите его в пустую строку с помощью --sql-mode=""
в командной строке или sql-mode=""
в файле параметров.
Я добавил параметр sql-mode=""
в /etc/my.cnf
, и он сработал.
Это решение SO обсуждает способы узнать, какой файл my.cnf используется MySQL.
Не забудьте перезапустить MySQL после внесения изменений.
Я заметил, что решение @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 отклонения значения, вы можете узнать больше об этом здесь
Если вы используете WAMP. Щелкните левой кнопкой мыши по значку WAMP, затем перейдите в MySQL → Настройки MySQL → sql-mode и затем выберите режим sql-mode- > user
В моем 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.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. Вот оно!
Я использую доктрину, и я добавил 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 в привилегиях.
Если вы используете 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
Это постоянное решение для 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"
Для кого работает VPS/сервер с cPanel/WHM, вы можете сделать следующее, чтобы навсегда отключить ONLY_FULL_GROUP_BY
Вам нужен root-доступ (на VPS или на выделенном сервере)
Введите WHM от имени пользователя root и запустите phpMyAdmin.
Нажмите на Переменные, найдите 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
Подключитесь к вашему серверу через SFTP - SSH (root) и загрузите файл /etc/my.cnf
Откройте с помощью текстового редактора файл 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
Сохраните файл my.cnf
и загрузите его обратно в /etc/
Введите WHM и перейдите к "WHM> Перезапустить службы> SQL Server (MySQL)" и перезапустите службу
Вот что я выполнил, чтобы исправить на 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'
Вот мое решение, изменяющее конфигурацию Mysql через панель управления phpmyadmin:
Чтобы исправить "это несовместимо с sql_mode = only_full_group_by": Откройте phpmyadmin и перейдите на главную страницу и выберите подменю "Переменные". Прокрутите вниз, чтобы найти режим sql. Измените режим sql и удалите 'ONLY_FULL_GROUP_BY' Сохраните его.