mysql concat函数拼接字符串时遇NULL即返null;推荐用concat_ws跳过null或ifnull转空串;update/where中需防null导致逻辑错误;注意字符集统一避免隐式转换异常。

MySQL CONCAT 函数的基本用法
CONCAT 是 MySQL 中最常用的字符串拼接函数,它接受一个或多个参数,将它们按顺序连接成单个字符串。只要任意一个参数为 NULL,整个结果就返回 NULL——这点非常关键,实际写 SQL 时容易踩坑。
常见写法示例:
SELECT CONCAT('Hello', ' ', 'World'); -- 返回 'Hello World' SELECT CONCAT('id:', id, ', name:', name) FROM users;
注意:CONCAT 不会自动跳过 NULL 值,比如 CONCAT('a', NULL, 'b') 结果是 NULL,不是 'ab'。
处理 NULL 值:用 CONCAT_WS 或 IFNULL 替代
当字段可能为 NULL(如用户 middle_name 为空),直接用 CONCAT 会导致整条拼接结果丢失。这时候有两个更稳妥的选择:
-
CONCAT_WS(W S = With Separator):第一个参数是分隔符,后续参数自动跳过NULL,只拼接非空值。例如CONCAT_WS(', ', first_name, middle_name, last_name)即使middle_name是NULL,也会输出'John, Doe' -
IFNULL(col, '')或COALESCE(col, ''):把NULL显式转为空字符串再传给CONCAT,例如CONCAT(first_name, ' ', IFNULL(middle_name, ''), ' ', last_name)
推荐优先用 CONCAT_WS,语义清晰、代码简洁,且天然规避 NULL 问题。
CONCAT 在 UPDATE 和 WHERE 中的典型误用
有人试图在 UPDATE 里用 CONCAT 拼接新值,却忘了字段本身可能是 NULL,导致更新后变空:
UPDATE logs SET content = CONCAT(content, '[Error]') WHERE id = 123;
如果原 content 是 NULL,那更新结果就是 NULL,不是预期的 '[ERROR]'。正确做法是:
- 用
IFNULL(content, '')包裹 - 或改用
CONCAT_WS('', content, '[ERROR]')(分隔符为空) - 更安全的写法:
UPDATE logs SET content = CONCAT(IFNULL(content, ''), '[ERROR]') WHERE id = 123;
同理,在 WHERE 中拼接查询条件(如模糊匹配)时,也要检查字段是否可空,否则 LIKE CONCAT('%', col, '%') 可能因 col 为 NULL 而失效。
性能与字符集注意事项
CONCAT 本身开销极小,但要注意隐式字符集转换带来的潜在问题:
- 若拼接的字段/字面量使用不同字符集(如 utf8mb4 和 latin1),MySQL 会尝试转换,可能触发警告甚至报错
Illegal mix of collations - 解决方案:统一用
CONVERT(... using utf8mb4)或在连接前显式声明字符集,例如CONCAT(CONVERT(name USING utf8mb4), ' - ', CONVERT(id, char)) - 对大字段(
TEXT)频繁拼接并用于排序或索引字段时,可能影响执行计划,建议只在必要场景使用
真正容易被忽略的是字符集一致性——开发时本地库是 utf8mb4,上线后测试库用的是 latin1,CONCAT 就可能悄无声息地出错,查起来很费时间。