mysql concat函数拼接字符串时遇null即返null,需用coalesce转空字符串;concat_ws自动跳过null并支持分隔符,但分隔符不能为null。

MySQL 中 CONCAT 函数的基本用法
MySQL 的 CONCAT 函数用于拼接两个或多个字符串,返回一个合并后的结果。它不自动处理 NULL 值——只要任意一个参数为 NULL,整个结果就是 NULL,这点极易踩坑。
基本语法:CONCAT(str1, str2, ...),支持任意数量的字符串参数(包括列名、常量、表达式)。
-
CONCAT('Hello', ' ', 'World')→'Hello World' -
CONCAT(first_name, ' ', last_name)适用于姓名字段组合 - 若
middle_name为NULL,CONCAT(first_name, middle_name, last_name)直接返回NULL
如何安全地处理 NULL 参与拼接
生产环境中字段常含 NULL,直接用 CONCAT 会导致整行数据“消失”。必须显式转换 NULL 为字符串(如空字符串)。
推荐写法:CONCAT(COALESCE(col1, ''), COALESCE(col2, '')),其中 COALESCE 返回第一个非 NULL 值。
-
CONCAT(name, ' (', COALESCE(phone, ''), ')')避免因phone为NULL导致括号前全为空 - 不能用
IFNULL(col, '')替代COALESCE?可以,但COALESCE是标准 SQL,兼容性更好 - 注意:空字符串
''和空格' '效果不同,拼接地址时漏掉空格会变成'BeijingShanghai'
CONCAT_WS:带分隔符的拼接更省心
当需要统一加连接符(如逗号、竖线),用 CONCAT_WS(WS = With Separator)比嵌套多个 CONCAT 更简洁,且它会**自动跳过 NULL 参数**,只拼接非 NULL 值。
语法:CONCAT_WS(separator, str1, str2, ...)
-
CONCAT_WS(', ', first_name, middle_name, last_name)即使middle_name是NULL,也输出'Zhang, Li'而非NULL - 分隔符本身不能为
NULL,否则整个结果为NULL - 不支持对分隔符做条件判断(比如“有中间名才加逗号”),需配合
CASE手动控制
性能与字符集注意事项
CONCAT 本身开销极小,但不当使用可能引发隐式转换或截断,尤其在混合字符集或长度受限字段中。
- 拼接结果默认继承第一个参数的字符集;若列是
utf8mb4,但硬编码了'abc'(服务器默认latin1),可能报错或乱码 - 目标字段长度不足时,拼接后超长会被静默截断(取决于 SQL mode),建议提前用
CHAR_LENGTH检查总长 - 在 WHERE 或 ORDER BY 中大量使用
CONCAT会影响索引使用,例如WHERE CONCAT(last_name, first_name) = 'SmithJohn'无法走last_name索引










