我可以在 MySQL 中使用 before insert/update 触发器将空字符串转换为整数吗?

问题描述 投票:0回答:1

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

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

不幸的是,我的测试似乎表明MySQL在触发器触发之前抛出错误“

*1366 - Incorrect integer value: '' for column*
”,但我可能做错了。

mysql triggers
1个回答
0
投票

触发器不能引用客户端使用的语法。它只能访问整数类型的

NEW.<column_name>
。因此,字符串
''
必须在触发器开始执行之前转换为整数。

在您的情况下导致错误的是

严格模式。在严格模式下,整数上下文中像 ''

 这样的字符串是错误的。在非严格模式下,它转换为整数类型的隐式默认值,即0。参见
https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#数据类型默认值隐式

因此您有以下选择:

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