es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MariaDB 10.5, cambiar sql_mode en .cnf no cambia @@sql_mode, ¿por qué?

Fedora Desktop 35 ejecutando MariaDB 10.5, instalación completamente nueva de hace aproximadamente un mes.

¿Por qué mi cambio en el archivo “/etc/my.cnf/mariadb-server.cnf” para “sql_mode” cambia “@@GLOBAL.sql_mode” pero no “@@sql_mode”?

Estoy intentando eliminar “STRICT_TRANS_TABLES” de mi “sql_mode” (tengo una columna que es DATETIME NOT NULL que necesito omitir de una inserción y que asuma un valor predeterminado). Mi sistema tiene una instalación simple de MariaDB con un archivo “/etc/my.cnf” casi vacío que incluye todos los archivos en “/etc/my.cnf.d” donde hay un “mariadb-server.cnf” con una sección “[server]” donde puedo configurar “sql-mode”.

Si se omite, se establece por defecto como se especifica en https://mariadb.com/docs/reference/mdb/system-variables/sql_mode/ en “STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”. Confirmado mediante la consulta a través de SquirrelSQL:

SELECT @@GLOBAL.sql_mode global, @@sql_mode;
global @@sql_mode
STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Por lo tanto, de forma predeterminada, tanto “@@sql_mode” como “@@GLOBAL.sql_mode” son equivalentes.

Agregando esto a “mariadb-server.cnf” (la línea “[server]” ya estaba allí):

[server]
sql_mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Reinicié el servidor con “systemctl restart mariadb”, no hay errores en el registro, y volví a ejecutar la consulta anterior:

global @@sql_mode
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Nótese que el “sql_mode” global ya no tiene “STRICT_TRANS_TABLES”, ¡pero el que no es global sí lo tiene! ¿Por qué y qué puedo hacer al respecto?

La inserción sigue fallando debido a que sigue vigente la regla estricta.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, parece que el ajuste sql_mode en /etc/my.cnf/mariadb-server.cnf solo está afectando a la variable global sql_mode (@@GLOBAL.sql_mode) y no a la variable específica de sesión sql_mode (@@sql_mode). Esto podría deberse al hecho de que sql_mode puede establecerse a nivel global o específicamente para una sesión, y es posible que el cliente que se conecta a la base de datos esté estableciendo su propio sql_mode de sesión que está anulando el ajuste global.

    Para confirmar esto, puedes intentar ejecutar los siguientes comandos en un cliente de MariaDB:

    -- Establecer el sql_mode global
    SET GLOBAL sql_mode='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    
    -- Establecer un sql_mode específico de sesión
    SET SESSION sql_mode='STRICT_TRANS_TABLES';
    
    -- Verificar las variables sql_mode
    SELECT @@GLOBAL.sql_mode, @@sql_mode;
    

    Si los comandos anteriores muestran que el sql_mode específico de sesión está establecido en STRICT_TRANS_TABLES y el sql_mode global está establecido en el valor deseado, entonces es probable que el ajuste en /etc/my.cnf/mariadb-server.cnf solo esté afectando a la variable global y no a las sesiones que se conectan a la base de datos.

    Para anular el ajuste sql_mode específico de sesión y aplicar el sql_mode deseado, puedes establecerlo explícitamente en el cliente al conectarte a la base de datos, o editar el archivo my.cnf del cliente específico (si corresponde) para incluir el sql_mode deseado.

Comments are closed.