Accidentalmente habilité el modo ONLY_FULL_GROUP_BY así:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
¿Cómo lo desactivo?
column
) para actualizar su consulta. Ver documento aquí
Accidentalmente habilité el modo ONLY_FULL_GROUP_BY así:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
¿Cómo lo desactivo?
column
) para actualizar su consulta. Ver documento aquí
Respuestas:
Solución 1: eliminar ONLY_FULL_GROUP_BY de la consola mysql
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
puedes leer más aquí
Solución 2: eliminar ONLY_FULL_GROUP_BY de phpmyadmin
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')
, MySQL de todos modos elimina las comas no deseadas del registro. La respuesta de OP es correcta.
GLOBAL
no funcionó para mí, pero lo SESSION
hizo. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Para mantener su configuración actual de mysql y deshabilitar, ONLY_FULL_GROUP_BY
le sugiero que visite su phpmyadmin o cualquier cliente que esté usando y escriba:
SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me
siguiente copia el resultado a su my.ini
archivo.
menta :sudo nano /etc/mysql/my.cnf
ubuntu 16 y superior :sudo nano /etc/mysql/my.cnf
ubuntu 14-16 :/etc/mysql/mysql.conf.d/mysqld.cnf
copy_me
El resultado puede contener un texto largo que puede recortarse de forma predeterminada. ¡Asegúrate de copiar todo el texto!vieja respuesta:
Si desea deshabilitar permanentemente el error "La expresión #N de la lista SELECT no está en la cláusula GROUP BY y contiene la columna no agregada 'db.table.COL' que no depende funcionalmente de las columnas en la cláusula GROUP BY; esto es incompatible con sql_mode = only_full_group_by "hacer esos pasos:
sudo nano /etc/mysql/my.cnf
Agregue esto al final del archivo
[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
reiniciar MySQL
Esto se deshabilitará ONLY_FULL_GROUP_BY
para TODOS los usuarios
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
puede no estar en este archivo, podría estar en un directorio de inclusión. Use este comando primero:grep -R "\[mysqld\]" *
para ver lo que hay allí - y para el caso trygrep -R "\bsql_mode\b" *
Tenga cuidado al usar
SET sql_mode = ''
Esto realmente borra todos los modos actualmente habilitados. Si no desea meterse con otras configuraciones, querrá hacer un
SELECT @@sql_mode
primero, para obtener una lista separada por comas de los modos habilitados, luego CONFIGURARLA en esta lista sin la ONLY_FULL_GROUP_BY
opción.
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>
luego, detenga e inicie su servidor. Siga los documentos de su sistema operativo para conocer la ubicación y la mejor manera de editar my.cnf.
Prueba esto:
SET sql_mode = ''
Nota de la comunidad: Como se señala en las respuestas a continuación, en realidad esto borra todos los modos SQL actualmente habilitados. Eso puede no ser necesariamente lo que quieres.
''
= 'full group by is disabled'
? MySQL hace algunas cosas bastante tontas, pero esa está ahí arriba.
0 rows affected
y mi consulta aún no funciona:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
global
en el comando .
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
reversión al valor anterior. ¿Qué puedo hacer ahora?
Agregar solo un modo a sql_mode sin eliminar los existentes:
SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));
Eliminar solo un modo específico de sql_mode sin eliminar otros:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));
En su caso, si desea eliminar solo el ONLY_FULL_GROUP_BY
modo, utilice el siguiente comando:
SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Referencia: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html
Gracias a @cwhisperer. Tuve el mismo problema con Doctrine en una aplicación Symfony. Acabo de agregar la opción a mi 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',''))"
Esto funcionó bien para mi.
SET NAMES
usando este método, en la mayoría de los casos, Symfony ya no lo necesita a través de doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , y lo hace correctamente a través de PDO dns, SET NAMES es una forma desactualizada de hacerlo, que no debe usarse para una versión PHP superior a 5.3
En:
Hacer:
$ sudo nano /etc/mysql/conf.d/mysql.cnf
Copiar y pegar:
[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
Al final del archivo
$ sudo service mysql restart
/etc/mysql/mysql.cnf
apunta a 2 carpetas de configuración !includedir /etc/mysql/conf.d/
+ !includedir /etc/mysql/mysql.conf.d/
. Lo mismo vale para /etc/mysql/my.cnf
. Por lo tanto, supongo que los archivos de configuración no se anulan después de la actualización. Puedes leer más aquí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"
tal vez es importante crear un nuevo archivo en su /etc/mysql/mysql.conf.d/mysqld_mode.cnf
lugar
He notado que la solución @Eyo Okon Eyo funciona siempre que el servidor MySQL no se reinicie, luego se restablecen las configuraciones predeterminadas. Aquí hay una solución permanente que funcionó para mí:
Para eliminar el modo SQL en particular (en este caso, ONLY_FULL_GROUP_BY ), busque el modo SQL actual:
SELECT @@GLOBAL.sql_mode;
copie el resultado y elimine de él lo que no necesita ( ONLY_FULL_GROUP_BY )
p.ej:
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
a
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
crea y abre este archivo:
/etc/mysql/conf.d/disable_strict_mode.cnf
y escriba y pegue en él su nuevo modo 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
reiniciar MySQL:
sudo service mysql restart
O puede usar ANY_VALUE()
para suprimir el rechazo de valor ONLY_FULL_GROUP_BY, puede leer más sobre esto aquí
ANY_VALUE()
La documentación de MySQL también especifica los siguientes métodos:
sql-mode="<modes>"
en un archivo de opciones como my.cnf (sistemas operativos Unix) o my.ini (Windows).--sql-mode="<modes>"
opción*Dónde <modes>
hay una lista de diferentes modos separados por comas.
Para borrar el modo SQL explícitamente, configúrelo en una cadena vacía usando --sql-mode=""
en la línea de comando, osql-mode=""
en un archivo de opciones.
Agregué la sql-mode=""
opción /etc/my.cnf
y funcionó.
Esta solución SO analiza formas de averiguar qué archivo my.cnf está siendo utilizado por MySQL.
No olvide reiniciar MySQL después de realizar cambios.
SELECT @@GLOBAL.sql_mode;
Si estás usando WAMP. Haga clic con el botón izquierdo en el icono WAMP, luego vaya a MySQL -> Configuración de MySQL -> sql-mode y luego seleccione sql-mode-> user mode
En mi sql (versión 5.7.11 ejecutándose en Mac OS X) esto funciona para mí en el cliente de shell 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"
De acuerdo con la documentación de MySQL 5.6, sql_mode está predeterminado es
cadena en blanco en MySQL 5.6.5 y viceversa NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES en 5.6.6 +
sql_mode := ''
ser posibles. ¿Por qué no estás de acuerdo?
En MySQL 5.7 y Ubuntu 16.04, edite el archivo mysql.cnf.
$ sudo nano /etc/mysql/conf.d/mysql.cnf
Incluya el sql_mode como el siguiente y guarde el archivo.
[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Observe que, en mi caso, eliminé el modo STRICT_TRANS_TABLES y el ONLY_FULL_GROUP_BY.
Al hacer esto, guardará la configuración del modo de forma permanente. De manera diferente si solo actualiza @@ sql_mode a través de MySQL, porque se restablecerá al reiniciar la máquina / servicio.
Después de eso, para la configuración modificada, tome medidas, reinicie el servicio mysql:
$ sudo service mysql restart
Intenta acceder al mysql:
$ mysql -u user_name -p
Si puede iniciar sesión y acceder a la consola MySQL, está bien. ¡Excelente!
PERO , si como yo, te enfrentas al error "variable desconocida sql_mode" , que indica que sql_mode es una opción para mysqld , tendrás que regresar, editar el archivo mysql.cnf nuevamente y cambiarlo [mysql]
a [mysqld]
. Reinicie el servicio MySQL y haga una última prueba intentando iniciar sesión en la consola MySQL. ¡Aquí está!
Esto es lo que realicé para arreglar en Mysql workbench:
Antes de obtener el valor actual con el siguiente comando
SELECT @@sql_mode
luego eliminé la clave ONLY_FULL_GROUP_BY de la lista y pegué el siguiente comando
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 o posterior
Para agregar o eliminar un modo sql_mode
, puede usar list_add
y list_drop
funciones.
Para eliminar un modo del actual SESSION.sql_mode
, puede usar uno de los siguientes:
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');
Para eliminar un modo del GLOBAL.sql_mode
que persiste para la operación de tiempo de ejecución actual , hasta que se reinicie el servicio .
SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');
MySQL 5.7.8 o anterior
Dado que el sql_mode
valor es una cadena de modos CSV, deberá asegurarse de que la cadena no contenga comas residuales, lo que se puede lograr mediante el uso TRIM(BOTH ',' FROM ...)
.
Para eliminar un modo de la sql_mode
variable, debe usarlo REPLACE()
junto con TRIM()
para asegurarse de que se eliminen las comas residuales.
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', ''));
Para agregar un modo a la sql_mode
variable, querrá usarlo CONCAT_WS(',', ...)
, para asegurarse de que se agregue una coma con los modos actuales y TRIM()
para asegurarse de que se eliminan las comas residuales.
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));
NOTA: Cambiar la
GLOBAL
variable no se propaga a laSESSION
variable hasta que se establezca una nueva conexión.La
GLOBAL
variable persistirá hasta que se reinicie el servicio en ejecución.La
SESSION
variable persistirá para la conexión actual, hasta que la conexión se cierre y se establezca una nueva conexión.
GLOBAL.sql_mode
Como SET sql_mode = 'ONLY_FULL_GROUP_BY';
se ejecutó sin el GLOBAL
modificador, el cambio solo afectó el SESSION
valor del estado actual , que también pertenece @@sql_mode
. Para eliminarlo y volver al valor predeterminado global de reinicio del servidor , querrá usar el valor de @@GLOBAL.sql_mode
. [sic]
El
SESSION
valor actual solo es válido para la conexión actual. Reconectarse al servidor revertirá el valor nuevamente alGLOBAL
valor.
Para revertir el valor del estado de la sesión actual al valor global actual, puede usar uno de los siguientes:
SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;
Cambiar SESSION.sql_mode
valor aONLY_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 |
+--------------------+----------------------------------------------+
Revertir el SESSION.sql_mode
valor al GLOBAL.sql_mode
valor
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
Para configurar el modo SQL al inicio del servidor, use la
--sql-mode="modes"
opción en la línea de comandos osql-mode="modes"
en un archivo de opciones como my.cnf (sistemas operativos Unix) o my.ini (Windows). [sic]
Consulte su versión de MySQL para determinar los modos admitidos y predeterminados .
[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4
sql_mode
Valores por defectoComo se han eliminado los valores de la documentación de MySQL por versión, los he agregado aquí para su referencia.
MySQL> = 8.0.11 8.0.5 - 8.0.10 Omitido
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
''
Para Mac OS Mojave (10.14) Terminal abierto
$ 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
Pegar siguiente:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Teclas abreviadas para guardar y salir de nano: Ctrl+x
y y
yEnter
Nota: es posible que deba actualizarmysql-5.7.24-macos10.14-x86_64
estos comandos, solo verifique el nombre correcto de la carpeta que recibió/usr/local/
¡Espero que ayude a alguien!
Si está utilizando MySQL 8.0.11, debe eliminar el 'NO_AUTO_CREATE_USER' del modo sql.
Agregue la siguiente línea en el archivo /etc/mysql/my.cnf
y el encabezado [mysqld]
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Estoy usando doctrina y he agregado las opciones driver en mi 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',''))"
),
),
),
),
));
En phpmyadmin, el usuario necesita SUPER activado en los privilegios.
Para quién está ejecutando un VPS / Servidor con cPanel / WHM , puede hacer lo siguiente para deshabilitar permanentemente ONLY_FULL_GROUP_BY
Necesita acceso root (ya sea en un VPS o en un servidor dedicado)
Ingrese WHM como root y ejecute phpMyAdmin
Haga clic en Variables, busque sql_mode
, haga clic en 'Editar' y copie toda la línea dentro de ese cuadro de texto
por ejemplo, copie esto:
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
Conéctese a su servidor a través de SFTP - SSH (root) y descargue el archivo /etc/my.cnf
Abra con un my.cnf
archivo de editor de texto en su PC local y pegue en él (en la [mysqld]
sección) la línea completa que copió en el paso (2) pero elimineONLY_FULL_GROUP_BY,
pe pegar esto:
# 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
Guarde el my.cnf
archivo y cárguelo nuevamente/etc/
Ingrese WHM y vaya a "WHM> Reiniciar servicios> SQL Server (MySQL)" y reinicie el servicio
Estoy trabajando con mysql y registrado con el usuario root, la solución que funciona para mí es la siguiente:
mysql> SET SESSION sql_mode = (SELECCIONE REEMPLAZAR (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Esta es una solución permanente para MySql 5.7+ en 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
Si puede iniciar sesión sin errores, ya debería estar listo.
Puede deshabilitarlo usando el archivo de configuración my.cnf
:
$ mysql --verbose --help | grep my.cnf
Entonces, en macOS 10.12, está en usr/local/etc/my.cnf
. Puedes editar sql_mode
aquí:
# 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"
Aquí está mi solución cambiando la configuración de Mysql a través del panel de phpmyadmin:
Para corregir "esto es incompatible con sql_mode = only_full_group_by": Abra phpmyadmin y vaya a la página de inicio y seleccione el submenú 'Variables'. Desplácese hacia abajo para encontrar el modo sql. Edite el modo sql y elimine 'ONLY_FULL_GROUP_BY' Guárdelo.
SET sql_mode = ''
?