MySQL/MariaDB 配置警告以抛出错误

Posted

技术标签:

【中文标题】MySQL/MariaDB 配置警告以抛出错误【英文标题】:MySQL/MariaDB Configure Warnings to throw Errors 【发布时间】:2021-12-14 22:29:48 【问题描述】:

我需要 MySQL/MariaDB 来抛出错误消息而不是警告消息。

原因: 在我的开发环境中,SQL/php 中的警告被忽略(SQL 和 PHP 都继续处理),因此我在测试时无法检测到任何问题。但是,在生产环境中,所有警告都会使查询崩溃,从而终止 API,并向用户返回“失败”消息。

这是一个非常糟糕的结果,在过去引起了很多头痛。

这是一个非常具体的场景,它会导致很多问题:

我有一个表“testtable”,其中包含两列“pk”和“bRequiredBoolean”,其中 pk 是主键(因此自动递增),bRequiredBoolean 没有默认值:

CREATE TABLE `test`.`testtable` ( `pk` INT NOT NULL AUTO_INCREMENT , `bRequiredBoolean` BOOLEAN NOT NULL , PRIMARY KEY (`pk`)) ENGINE = InnoDB;

在我的开发服务器中,我可以运行以下查询:

INSERT INTO `testtable`() VALUES ()

并收到以下警告:

Warning: #1364 Field 'bRequiredBoolean' doesn't have a default value

在我的开发服务器中,条目已插入,API 继续执行。

在我的生产服务器中,条目 ISN'T INSERTED 并且 API 崩溃。

我知道开发/测试服务器应该相同以防止出现此类问题,但我目前没有资金购买额外的许可证,所以我想要一个替代解决方案来抛出错误消息而不是警告捕捉上面提到的场景。

重要提示:我不想在每个查询中插入任何额外的代码,我更愿意编辑一些配置文件。例如,我不想将以下代码添加到每个单独的查询中:

SHOW COUNT(*) WARNINGS

我宁愿编辑一些配置文件,这样它总是会抛出错误,即使我直接通过 GUI 进行临时查询。

我发现了其他类似的问题,但没有人回复这些帖子:

MariaDB shows warnings instead of errors

Throw error on mysql warning pdo

非常感谢任何帮助。

【问题讨论】:

比较你在两种环境下的SQL_MODE。 非常感谢巴尔玛!这正是我需要解决我的问题。我在下面添加了解决我的问题的官方答案。 【参考方案1】:

感谢 Barmar 的评论,我找到了解决问题的方法。

您可以通过以下方式检查您的 SQL_Mode:

SELECT @@SQL_MODE;

显然,有一个 SQL_Mode 设置专门针对称为 “Traditional”的所有警告引发错误

有关 SQL_Mode 值的更多信息,您可以查看官方 mySQL 网站:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-full

所以我运行了以下查询:

SET GLOBAL sql_mode = 'TRADITIONAL';

运行查询后,我执行了与之前相同的查询:

INSERT INTO `testtable`() VALUES ()

并收到以下错误:

Error
SQL query: Copy


INSERT INTO `testtable`() VALUES ();
MySQL said: Documentation

#1364 - Field 'bRequiredBoolean' doesn't have a default value

这正是我所需要的。非常感谢@Barmar!

【讨论】:

这不会将所有警告显示为错误***.com/questions/4289205/…

以上是关于MySQL/MariaDB 配置警告以抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

Mysql/Mariadb配置日志

mysql,mariadb主从复制

mysql mariadb 密码设置

11.1LAMP架构介绍11.2MySQL MariaDB介绍11.311.411.5MySQL安装

Corosync+pacemaker+DRBD+mysql(mariadb)实现高可用(ha)的mysql集群(centos7)

grails spring security rest status 401重定向到控制器的动作以抛出自定义错误消息