Я випадково ввімкнув режим 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
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
для ВСІХ користувачів
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
може бути в цьому файлі, воно може бути в каталозі включення. Спершу скористайтеся цією командою: 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. У мене була така ж проблема з доктриною в додатку 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
цей метод, у більшості випадків це не потрібно. Симфонія вже встановлена ?? через 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, а потім виберіть режим sql-> користувальницький режим
У моєму 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 є опцією для mysqld , вам доведеться повернутися назад, відредагувати файл 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'
Для 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/
Сподіваюся, це комусь допоможе!
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
. [sic]
Поточне
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). [sic]
Будь ласка, перегляньте свою версію 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
''
Якщо ви використовуєте 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.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
Вам потрібен кореневий доступ (або на 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 і перейдіть на головну сторінку та виберіть підменю "Змінні". Прокрутіть вниз, щоб знайти режим sql. Редагуйте режим sql та видаліть "ONLY_FULL_GROUP_BY" Збережіть його.
SET sql_mode = ''
?