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就可能悄无声息地出错,查起来很费时间。
