Я випадково ввімкнув режим 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_modeMySQL 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 = ''?