我可以在MySQL中使用插入/更新之前触发器将空字符串转换为整数吗?

Can I use a before insert/update trigger in MySQL to cast an empty string to an integer?

提问人:Craig Jacobs 提问时间:11/11/2023 最后编辑:PM 77-1Craig Jacobs 更新时间:11/11/2023 访问量:17

问:

MySQL在严格模式下运行。第三方程序正在生成我无权修改的 SQL。数据是...㛺。他们的数据中有一个字段应该是一个整数,但在许多情况下是一个空字符串 ('')。

是否可以在 MySQL 8 中使用 before 触发器来解决这个问题?由于我无法修改外部代码,因此我唯一的其他选择是更改SQL_MODE。

不幸的是,我的测试似乎表明MySQL在触发器触发之前抛出错误“”,但我可能做错了。*1366 - Incorrect integer value: '' for column*

MySQL 触发器

评论

0赞 PM 77-1 11/11/2023
发布架构、代码、示例数据和所需结果。

答:

1赞 Bill Karwin 11/11/2023 #1

触发器不能引用客户端使用的语法。它只能访问 ,它具有整数类型。因此,在触发器开始执行之前,字符串必须转换为整数。NEW.<column_name>''

在您的案例中导致错误的是严格模式。在严格模式下,整数上下文中的字符串是错误。在非严格模式下,它转换为整数类型的隐式默认值,即 0。查看 https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#data-type-defaults-implicit''

因此,您有以下选择:

  • 更改客户端的代码。但是你说你没有权限这样做。
  • 禁用严格模式。如果可以更改客户端代码,则可以设置会话模式,但由于无法更改,因此必须全局设置。这很不幸,因为我通常建议保持严格模式启用,这样可以防止格式错误的数据。
  • 将列的数据类型更改为字符串,以便允许 .然后,可以编写一个触发器,以便在看到空字符串时将列设置为字符串。将数字存储为字符串可能会产生其他后果,例如,如果要使用不等式进行搜索或要按列排序,它将按字母顺序排序,而不是按数值排序。'''0'
  • 尝试使用查询重写插件。但我不会选择这个解决方案。在这种情况下,开发和维护查询重写器的工作可能比上述任何选项都更困难。

这些解决方案都不是优雅的,但我知道你必须让它发挥作用。

无论如何,我还建议向制造该第三方软件的供应商报告错误。它们不应该在MySQL中假设或要求非严格模式。

评论

0赞 Craig Jacobs 11/11/2023
查看我的代码,我决定最好的解决方案是将数据库中的列更改为 varchar 并修改我的代码以将 varchar 转换为 int。