Internet, Informática y Tecnología

Cómo desactivar modo estricto (Strict Mode) de MySQL y MariaDB

MariaDB Logo

El modo estricto en MySQL o MariaDB es un modo que nos limita y no nos deja realizar malas prácticas, como insertar una cantidad grande de caracteres cuando el límite es bajo en un determinado campo. Hacer esto puede tener dos consecuencias dependiendo de la versión que usemos, por ejemplo, puede recortar nuestros datos y mostrar una advertencia, o la declaración no se ejecutará y nos mostrará un error, y ninguna de las dos cosas es necesariamente de nuestro agrado.

Comprobar si el 'Strict Mode' está activado

Para ello accedemos por la terminal a MySQL con nuestro usuario y contraseña o con algún software como phpMyAdmin en un servidor web, HeidiSQL en Windows, o DBeaver en Linux, Mac, y Windows. Ejecutamos los siguientes comandos según el caso.

Desde una terminal, cambiar root por el usuario que usemos, nos pedirá contraseña:

mysql -u root -p -e 'SHOW VARIABLES LIKE "sql_mode";'

Desde HeidiSQL, PhpMyAdmin o DBeaver:

SHOW VARIABLES LIKE "sql_mode";

Resultado en terminal:

+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------+

Resultado con HeidiSQL:

Variable_name Value
sql_mode STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

En cualquier caso, si aparece el texto STRICT_TRANS_TABLES o STRICT_ALL_TABLES, significa que el modo estricto se encuentra activado.

Desactivar el 'Strict Mode' de forma temporal o permanente

Existen dos formas de desactivar este modo, la primera es temporal y la segunda permanente. La forma temporal podría ser útil para depurar o para la ejecución de declaraciones SQL problemáticas. En cambio, la solución permanente podría ser útil cuando usamos sistemas que lo requieren, como por ejemplo al instalar Directus un CMS Headless, que en la documentación menciona que es necesario desactivar este modo.

Notas del procedimiento: Es recomendado que al desactivar este modo hay que copiar los otros modos que se encontraban activados, y solo restarle STRICT_TRANS_TABLES y STRICT_ALL_TABLES, los modos tienen que estar separados con coma y sin espacios.

Desactivado de forma temporal

Teniendo en cuenta que NO_ENGINE_SUBSTITUTION ya se encontraba activado y no queremos desactivarlo, solo ejecutamos la primera línea de cada recuadro, en caso de no tener ningún modo anteriormente, usamos la última línea de cada recuadro según sea el caso.

Para desactivarlo desde la terminal de forma temporal, solo tenemos que ejecutar el siguiente comando (reemplazando "root" por nuestro usuario):

mysql -u root -p -e 'SET sql_mode = 'NO_ENGINE_SUBSTITUTION';'

También podemos usar el siguiente si no tenemos ningún modo activado:

mysql -u root -p -e 'SET sql_mode = '';'

Para hacerlo desde un gestor ejecutar la declaración directamente:

SET sql_mode = 'NO_ENGINE_SUBSTITUTION';

O bien podemos usar el siguiente si no tenemos ningún modo activado:

SET sql_mode = '';

Importante: Si lo desactivamos de forma temporal, existe una limitación, y es que en el caso de usar la Terminal tenemos que ejecutar las consultas que requieran el modo estricto desactivado en ese mismo comando separado por punto y coma. En el caso de usar una Shell de MySQL es un poco más flexible y nos permite mantener el modo desactivado en lo que dura la Shell abierta. Ahora, en el caso de los gestores, igualmente tienen que ejecutarse las consultas en una misma petición.

Desactivado de forma permanente

Esto es un poco más sencillo, solo tenemos que editar nuestro archivo my.cnf o equivalente, en Debian el archivo se encuentra en la ruta /etc/mysql/my.cnf y en Windows con MariaDB se encuentra en C:\Program Files\MariaDB 10.3\data\my.ini, en algunas ocasiones puede estar en /etc/mysql/mariadb.conf.d/50-server.cnf en el caso de MariaDB.

En este archivo buscamos la opción sql_mode, y eliminamos STRICT_TRANS_TABLES y STRICT_ALL_TABLES. Si el archivo o variable no existe, la creamos y la establecemos como vacía en la sección [mysqld].

Si tenemos otros modos activados que no queremos desactivar:

sql_mode = "NO_ENGINE_SUBSTITUTION"

Si la opción no existe o si queremos desactivar todos los modos:

sql_mode = ""

Nota: Si la opción sql_mode no existe, se activan los modos que de forma predeterminada están establecidos, y en el caso del STRICT_TRANS_TABLES, en las últimas versiones está activado de forma predeterminada.

Etiquetas

Contenido relacionado