ifnull仅支持两个参数且只处理null值,coalesce支持多参数但类型检查更严格;二者均不识别空字符串或0等falsy值,需配合nullif或cast使用。

IFNULL只能处理两个参数,多一个就报错
MySQL 的 IFNULL 严格限定为两个参数,写成 IFNULL(col, 'a', 'b') 会直接触发 Incorrect parameter count 错误。它本质是“单点兜底”:只看第一个表达式是否为 NULL,是则返回第二个,否则原样返回第一个。
常见误用是拿它处理空字符串或数字 0:IFNULL('', 'default') 返回空字符串(因为 '' ≠ NULL),IFNULL(0, 1) 返回 0(0 不是 NULL)。它不判断“falsy”,只认 SQL 三值逻辑里的 NULL。
- 适用场景:字段明确可能为
NULL,且只需一个 fallback 值,比如IFNULL(phone, '未提供') - 不能用于跨库迁移——PostgreSQL、SQL Server 都不认识
IFNULL
COALESCE支持任意数量参数,但类型推导容易翻车
COALESCE 按顺序扫描参数,返回第一个非 NULL 值。但它会对所有参数做隐式类型兼容检查,哪怕某个参数根本不会被用到,类型冲突也会报错。
例如:COALESCE(1, 'abc') 成功返回 1(数值优先级高);但 COALESCE('abc', 1.5) 在某些 MySQL 版本里会因字符串与浮点数无法统一类型而失败。更隐蔽的是:COALESCE(NULL, 42, 'fallback') 返回 42,但若把 42 换成 '42',结果类型就变成字符串。
- 适用场景:需要链式 fallback,比如
COALESCE(username, nickname, email, 'anonymous') - WHERE 或 ORDER BY 中安全处理
NULL:ORDER BY COALESCE(updated_at, created_at) DESC - 所有参数都为
NULL时返回NULL,不报错
别指望它们能替代 IS NOT NULL 或空字符串判断
IFNULL 和 COALESCE 都只响应 SQL 标准的 NULL,对空字符串、0、FALSE 完全无感。如果业务上要把 ''、0、NULL 统一视为空,必须配合 CASE WHEN 或 NULLIF:
COALESCE(NULLIF(trim(col), ''), 'default') 可先将空白字符串转为 NULL,再兜底;IFNULL(NULLIF(col, 0), 'zero_or_null') 可把 0 当 NULL 处理。
- 别在应用层混淆:PHP 的
empty()或 Python 的not value和这两个函数行为完全不同 - 类型混合时,优先显式转换:
COALESCE(CAST(age AS CHAR), '未知')比依赖隐式转换更可控
MySQL 9.6.0 对 COALESCE 的类型检查更严格了
2026 年发布的 MySQL 9.6.0 将外键和 Binlog 行为重构后,COALESCE 的参数类型校验也同步收紧。以前能蒙混过关的混合类型调用(如 COALESCE(int_col, varchar_col)),现在会在准备阶段就报错,而不是等到执行时才失败。
这意味着旧 SQL 在升级后可能突然中断。如果你的项目已用 COALESCE 混合类型,建议提前用 CAST 或 CONVERT 显式对齐类型,尤其在涉及聚合、索引字段或主从复制链路中。
真正容易被忽略的是:NULL 判断永远只基于 SQL 的三值逻辑,和任何编程语言里的“假值”概念无关。











