MySQL正在严格模式下运行。第三方程序正在生成我无权修改的 SQL。数据……不干净。他们的数据中有一个字段应该是整数,但在许多情况下是空字符串('')。
MySQL 8 中是否可以使用 before 触发器修复此问题?由于我无法修改外部代码,我唯一的其他选择是更改 SQL_MODE。
不幸的是,我的测试似乎表明MySQL在触发器触发之前抛出错误“
*1366 - Incorrect integer value: '' for column*
”,但我可能做错了。
触发器不能引用客户端使用的语法。它只能访问整数类型的
NEW.<column_name>
。因此,字符串 ''
必须在触发器开始执行之前转换为整数。
在您的情况下导致错误的是严格模式。在严格模式下,整数上下文中像 ''
这样的字符串是错误的。在非严格模式下,它转换为整数类型的隐式默认值,即0。参见https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#数据类型默认值隐式 因此您有以下选择:
''
。然后,您可以编写一个触发器,在看到空字符串时将该列设置为字符串
'0'
。将数字存储为字符串可能会产生其他后果,例如如果您想使用不等式进行搜索或想按列排序,它将按字母顺序而不是按数值排序。