Я случайно включил режим ONLY_FULL_GROUP_BY следующим образом:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Как мне это отключить?
column
) для модификации вашего запроса. Смотрите документ здесь
Я случайно включил режим ONLY_FULL_GROUP_BY следующим образом:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Как мне это отключить?
column
) для модификации вашего запроса. Смотрите документ здесь
Ответы:
Решение 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
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')
, MySQL в любом случае удаляет ненужные запятые из записи. ОП ответ правильный.
GLOBAL
у меня не сработало, но сработало SESSION
. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Чтобы сохранить текущие настройки 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 "сделать эти шаги:
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
для ВСЕХ пользователей
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
может отсутствовать в этом файле, оно может быть в каталоге include. Сначала используйте эту команду: grep -R "\[mysqld\]" *
чтобы увидеть, что там есть - и в этом отношении попробуйтеgrep -R "\bsql_mode\b" *
Будьте осторожны, используя
SET sql_mode = ''
Это на самом деле очищает все режимы, которые в настоящее время включены. Если вы не хотите связываться с другими настройками, вам нужно сделать
SELECT @@sql_mode
сначала, чтобы получить разделенный запятыми список включенных режимов, затем установите его в этот список без ONLY_FULL_GROUP_BY
опции.
then SET it to this list without the ONLY_FULL_GROUP_BY option.
?
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';
sql_mode=<comma-separated-list>
затем остановите и запустите ваш сервер. Следуйте документации по вашей операционной системе, чтобы найти и лучший способ отредактировать my.cnf.
Попробуйте это:
SET sql_mode = ''
Примечание сообщества: как указано в ответах ниже, это фактически очищает все включенные в настоящий момент режимы SQL. Это не обязательно то, что вы хотите.
''
= 'full group by is disabled'
? MySQL делает некоторые довольно глупые вещи, но этот наверху.
0 rows affected
и мой запрос все еще не работает:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
global
команду .
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
откат к предыдущему значению. Что я могу сделать сейчас?
Добавление только одного режима в 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',''))"
Это работало нормально для меня.
SET NAMES
с помощью этого метода, в большинстве случаев не требуется, чтобы symfony уже установил его через doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html и делает это правильно через PDO dns, SET NAMES - это устаревший способ сделать это, который не должен использоваться для версии PHP выше 5.3
На:
Делать:
$ 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
/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
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
вместо этого создать новый файл
Я заметил, что решение @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, вы можете прочитать больше об этом здесь
ANY_VALUE()
В документации 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 после внесения изменений.
SELECT @@GLOBAL.sql_mode;
Если вы используете WAMP. Щелкните левой кнопкой мыши на значке WAMP, затем перейдите в раздел MySQL -> Настройки MySQL -> sql-mode и затем выберите sql-mode-> user mode
На моем 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 +
sql_mode := ''
что это возможно. Почему ты не согласен?
В 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. Вот!
Вот что я выполнил, чтобы исправить на 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'
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
''
Для 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/
Надеюсь, это поможет кому-то!
Если вы используете 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
Я использую 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 в привилегиях.
Для кого работает 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 и зарегистрирован с пользователем root, решение, которое работает для меня заключается в следующем:
mysql> SET SESSION sql_mode = (ВЫБЕРИТЕ ЗАМЕНУ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Это постоянное решение для 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 и перейдите на домашнюю страницу и выберите подменю «Variables». Прокрутите вниз, чтобы найти режим sql. Отредактируйте режим sql и удалите «ONLY_FULL_GROUP_BY». Сохраните его.
SET sql_mode = ''
?