提问人:G M 提问时间:10/30/2021 最后编辑:G M 更新时间:10/30/2021 访问量:580
MySQL/MariaDB 配置警告以抛出错误
MySQL/MariaDB Configure Warnings to throw Errors
问:
我需要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
在我的开发服务器中,条目 IS INSERTED 并且 API 继续执行。
在我的生产服务器中,条目 ISN'T INSERTED 并且 API 崩溃。
我知道开发/测试服务器应该相同以防止出现此类问题,但我目前没有资金购买额外的许可证,因此我想要一种替代解决方案来抛出错误消息而不是警告,以捕获上述情况。
重要提示:我不想在每个查询中插入任何额外的代码,我更喜欢编辑一些配置文件。例如,我不想将以下代码添加到每个查询中:
SHOW COUNT(*) WARNINGS
我宁愿编辑一些配置文件,这样它总是会抛出错误,即使我直接通过 GUI 进行临时查询。
我发现了其他类似的问题,但没有人回应这些线程:
任何帮助都非常感谢。
答:
多亏了 Barmar 的评论,我找到了解决问题的方法。
您可以通过以下方式查看您的SQL_Mode:
SELECT @@SQL_MODE;
显然,有一个SQL_Mode设置专门为所有警告抛出错误,称为“传统”
您可以查看 mySQL 官方网站以获取有关SQL_Mode值的更多信息: 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!
评论