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.

JPro
fuente
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 .

Chadwick Meyer
fuente
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"
JPro
fuente
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.

Yashrajsinh Jadeja
fuente
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.

Devraj Gupta
fuente
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}
Serhii Popov
fuente
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"
Vineet Kumar
fuente
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/

Eric Korolev
fuente
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"
parmar shashikant
fuente
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í.

Cobra_Fast
fuente
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

Ankit Jindal
fuente
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 :-)

Cristiana chavez
fuente
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
ASHOK MANGHAT
fuente
-3
set global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Shadab Khan Zed
fuente