这之前一定有记录和问过,但我似乎找不到任何关于它的明智信息。
短版本/实际问题
创建 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 传入的方式,空字符串应在列中写入NULL
,0
应写入 0。
处理数据的过程使用以下 IF 函数来处理这些情况:
IF(variable="", NULL, variable)
如果上述variable = 0
产生NULL
,而不是预期的0
。
这里有几个阶段需要了解。表达式的左侧确定用于进行比较的类型,右侧将转换为该类型。到目前为止,它非常直观。下一步可能不太直观 - MySQL可以将字符串隐式转换为数字,即使字符串不代表数字。它通过获取可以使用的任何字符(即前导-
、数字、一个小数点)并将它们转换为数字,然后静默地忽略任何后续字符来实现这一点。'foo'
没有可以转换为数字的字符,因此它被隐式转换为零。