为什么MySQL IF(0 = 'foo', 1, 2)在1中解析,即字符串等于0



这之前一定有记录和问过,但我似乎找不到任何关于它的明智信息。

短版本/实际问题

创建 MySQL 过程时,以下内容解析为 true:

IF(0 = 'foo', 1, 2) /* resolves in 1 */

虽然字符串"foo"不等于 0。

以下查询解析为不为 true:

IF(1 = 'foo', 1, 2) /* resolves in 2 */

这是有道理的,因为字符串"foo"不等于 1。

怎么会这样呢?

实际用例

我有一列允许空值。有时此列应保存值 0。由于数据从 API 传入的方式,空字符串应在列中写入NULL0应写入 0。

处理数据的过程使用以下 IF 函数来处理这些情况:

IF(variable="", NULL, variable)

如果上述variable = 0产生NULL,而不是预期的0

这里有几个阶段需要了解。表达式的左侧确定用于进行比较的类型,右侧将转换为该类型。到目前为止,它非常直观。下一步可能不太直观 - MySQL可以将字符串隐式转换为数字,即使字符串不代表数字。它通过获取可以使用的任何字符(即前导-、数字、一个小数点)并将它们转换为数字,然后静默地忽略任何后续字符来实现这一点。'foo'没有可以转换为数字的字符,因此它被隐式转换为零。

最新更新