MySQL 5.0.15+中CONCAT函数会忽略NULL参数返回非NULL拼接结果,如SELECT CONCAT('a', NULL, 'b')返回'ab';而CONCAT_WS、+、||遇NULL仍返回NULL,需用IFNULL或COALESCE显式处理。

CONCAT函数本身不返回NULL,但MySQL版本差异会改变行为
MySQL 5.0.15之后的CONCAT函数天然跳过NULL参数——它不会让整个结果变NULL,而是直接忽略该字段。这是和CONCAT_WS、加号+或||运算符的关键区别。但很多人误以为CONCAT也会“被拖下水”,其实问题常出在自己混用了旧版逻辑,或没意识到字段本身是空字符串''而非NULL。
验证当前行为最简单的方法是执行:
SELECT CONCAT('a', NULL, 'b');
——在MySQL 5.0.15+中返回'ab',不是NULL。
真正踩坑的其实是CONCAT_WS和+运算符
如果你用的是CONCAT_WS(',', col1, col2),注意:只要任一参数为NULL,整个结果就是NULL(这是它的设计逻辑,不是bug)。而用+或||做字符串拼接时,在MySQL中它们本质是数值加法或逻辑或,遇到NULL必然得NULL。
-
CONCAT_WS(',', 'x', NULL)→NULL -
'x' + NULL→NULL -
'x' || NULL→NULL(开启PIPES_AS_CONCAT模式时)
安全拼接的三类实操方案
当业务要求“任意字段为NULL时显示为空字符串”,不能只靠CONCAT兜底,得主动干预:
- 用
IFNULL(col, '')包裹每个可能为NULL的字段:SELECT CONCAT(IFNULL(first_name, ''), ' ', IFNULL(last_name, '')) FROM users;
- 用
COALESCE(col, '')更通用(支持多备选值):SELECT CONCAT(COALESCE(nick, alias, name), '@', COALESCE(domain, 'example.com'));
- 若字段只是偶尔
NULL且想统一处理,可建生成列或视图预清洗,避免每次查询都写一堆IFNULL
别忽略空字符串和空白字符的干扰
CONCAT对''、' '、CHAR(0)照单全收,它们不会被跳过。比如CONCAT('A', '', 'B')返回'AB'没问题,但CONCAT('A', ' ', 'B')变成'A B',可能破坏格式预期。
如果字段来自用户输入或ETL清洗不彻底,建议组合使用:
CONCAT(TRIM(IFNULL(name, '')), ' ', TRIM(IFNULL(suffix, '')))
——TRIM防空白,IFNULL防NULL,顺序不能反(否则TRIM(NULL)还是NULL)。
真正容易被忽略的点是:你查到的“CONCAT不传NULL”的结论,只适用于NULL字面量或明确为NULL的列;一旦列里存了空格、制表符或不可见控制字符,CONCAT照拼不误,而且不报错、不警告。










