configuración global sql_mode en mysql


91

Estoy tratando de configurar sql_mode en mysql pero arroja un error.

Mando:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'

¿No es esta la forma correcta de configurar varios modos? ¿Cuáles son las ventajas de configurar los modos de sesión y globales? cual es el preferido? Tengo diferentes usuarios que intentan actualizar la base de datos con diferentes valores de UNC e insistieron en configurar el modo de sesión en 'NO_BACKSLASH_ESCAPES', pensé que tendría sentido establecer un modo gloabl para esto. ¿Esto tiene sentido?

Por favor hagamelo saber.

Gracias.


Esas citas errantes realmente me molestan; p. Como otros dijeron, estoy seguro de que esto definitivamente no es correcto solo por eso.
— dyasta

Respuestas:


205

Por cierto, si configura globales en MySQL:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

Esto no lo configurará PERMANENTEMENTE y se revertirá después de cada reinicio.

Por lo tanto, debe establecer esto en su archivo de configuración (por ejemplo, /etc/mysql/my.cnfen la sección [mysqld]), para que los cambios sigan vigentes después del reinicio de MySQL:

Archivo de configuración: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

ACTUALIZACIÓN: Las versiones más nuevas de Mysql (por ejemplo, 5.7.8 o superior) pueden requerir una sintaxis ligeramente diferente:

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

Asegúrese de que haya un guión entre sql-modeno un guión bajo y que los modos estén entre comillas dobles.

Siempre consulte los documentos de MySQL de su versión para ver las opciones del modo sql .


2
Gracias, configurar my.cnf funcionó para mí. Para aquellos interesados, esta página le dice cuáles son los modos sql_modes predeterminados en 5.7 y superior: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
— Richard

2
¡Nota de la versión 5.7! Ese era el problema.
— Ernestas Stankevičius

En una aplicación web real, la segunda consulta funciona. Acabo de agregar otra consulta después de la consulta de conexión mysqli. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; ¡Gracias Chad!
— GTodorov

1
En 5.7.20y para el caso de mysql.ini, usar un guión bajo y olvidar las comillas funciona bien, así:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
— Ifedi Okonkwo

30

Lo resolví.

el modo correcto es:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

17
ADVERTENCIA: En nuestra experiencia, esto no conserva la configuración después de un reinicio de MySQL ...
— Chadwick Meyer

1
Sí, esto no conserva la configuración después del reinicio
— prakashpoudel

4
Para retenerlo después de reiniciar para Unix, tuve que crear un archivo ~ / .my.cnf y agregar [mysqld] sql_mode = "<nuevo modo>". Espero que esto ayude
— Raman Singh

27

Configurando el modo sql permanentemente usando el archivo de configuración mysql.

En mi caso, tengo que cambiar el archivo /etc/mysql/mysql.conf.d/mysqld.cnfcomo mysql.conf.destá incluido en /etc/mysql/my.cnf. cambio esto en [mysqld]

[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"

acaba de eliminar el ONLY_FULL_GROUP_BYmodo sql porque estaba causando problemas.

Estoy usando ubuntu 16.04, php 7y mysql --version dame estomysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Después de este cambio, ejecute los siguientes comandos

sudo service mysql stop
sudo service mysql start

Ahora verifique los modos SQL con esta consulta SELECT @@sql_modey debería obtener los modos que acaba de configurar.


14

Copiar en archivo de configuración: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

MySQL reiniciar.

O también puedes hacer

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL reiniciar.


2
Creo que es en sql_modelugar de sql-mode.
— Raman Sahasi

13

Para alguien que busque en Google este error para MySQL 8.

MySQL 8.0.11 elimina el 'NO_AUTO_CREATE_USER' del modo sql.

MySQL 5.7: uso de GRANT para crear usuarios. En su lugar, use CREAR USUARIO. Seguir esta práctica hace que el modo SQL NO_AUTO_CREATE_USER sea irrelevante para las declaraciones GRANT, por lo que también está obsoleto. MySQL 8.0.11: Uso de GRANT para crear usuarios. En su lugar, use CREAR USUARIO. Seguir esta práctica hace que el modo SQL NO_AUTO_CREATE_USER sea irrelevante para las declaraciones GRANT, por lo que también se elimina.

Tomado de aqui

Entonces, tu sql_modepuedes ser así:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

O si está usando Docker, puede agregar el siguiente comando a docker-compose.yml

  mysql:
    image: mysql:8.0.13
    command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - 13306:${MYSQL_PORT}

3

Para cambios temporales, use el siguiente comando

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

Para un cambio permanente: vaya al archivo de configuración /etc/my.cnf o /etc/mysql/mysql.conf.d/mysqld.cnf y agregue las siguientes líneas y luego reinicie el servicio mysql

[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"

2

Acceda a la base de datos como usuario administrador (tal vez root).

Verificar SQL_mode actual

mysql> SELECT @@sql_mode;

Para establecer un nuevo sql_mode, salga de la base de datos, cree un archivo

nano /etc/mysql/conf.d/<filename>.cnf 

con su contenido sql_mode

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Reiniciar Mysql

mysql> sudo service mysql stop
mysql> sudo service mysql start

Creamos un archivo en la carpeta /etc/mysql/conf.d/ porque en el archivo de configuración principal /etc/mysql/my.cnf el comando está escrito para incluir todos los archivos de configuración de la carpeta / etc / mysql / conf. re/


1

En mi caso, tengo que cambiar el archivo, /etc/mysql/mysql.conf.d/mysqld.cnfcambie esto en [ mysqld]

Pegue esta línea en la parte [ 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"

1

Acabo de tener un problema similar en el que MySQL (5.6.45) no aceptaba sql_modeningún archivo de configuración.

La solución fue agregarlo init_file = /etc/mysql/mysql-init.sqlal archivo de configuración y luego ejecutarlo SET GLOBAL sql_mode = '';allí.


1

Consulte la documentación de sql_mode

Método 1:

Verifique el valor predeterminado de sql_mode:

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

Método 2:

Acceda a phpmyadmin para editar su sql_mode

  • Inicie sesión en phpmyadmin y abra localhost
  • Arriba en las variables presentes en la parte superior de los elementos del menú y busque el modo SQL
  • Haga clic en el botón editar para modificar sql_mode según sus requisitos
  • Guardar los cambios

configuración del modo sql en phpmyadmin

Reinicie el servidor después de ejecutar las cosas anteriores


1

En mi caso mysql y ubuntu 18.04

Lo configuré permanentemente usando este comando

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Agregue la línea después de la configuración. Vea el ejemplo resaltado en la imagen a continuación.

sql_mode = ""

Nota: También puede agregar diferentes modos aquí, depende de su necesidad NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Consulte la documentación y la referencia de los modos SQL disponibles

agregando el modo sql

Entonces guarda. Después de guardar, debe reiniciar su servicio mysql, siga el comando a continuación:

sudo service mysql restart

Espero que esto ayude :-)


0

Si alguien quiere configurarlo solo para la sesión actual, use el siguiente comando

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

-3
set global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.