mysql如何进行字符串拼接_mysql concat函数使用

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

mysql如何进行字符串拼接_mysql concat函数使用

MySQL 中 CONCAT 函数的基本用法

MySQL 的 CONCAT 函数用于拼接两个或多个字符串,返回一个合并后的结果。它不自动处理 NULL 值——只要任意一个参数为 NULL,整个结果就是 NULL,这点极易踩坑。

基本语法:CONCAT(str1, str2, ...),支持任意数量的字符串参数(包括列名、常量、表达式)。

  • CONCAT('Hello', ' ', 'World')'Hello World'
  • CONCAT(first_name, ' ', last_name) 适用于姓名字段组合
  • middle_nameNULLCONCAT(first_name, middle_name, last_name) 直接返回 NULL

如何安全地处理 NULL 参与拼接

生产环境中字段常含 NULL,直接用 CONCAT 会导致整行数据“消失”。必须显式转换 NULL 为字符串(如空字符串)。

推荐写法:CONCAT(COALESCE(col1, ''), COALESCE(col2, '')),其中 COALESCE 返回第一个非 NULL 值。

  • CONCAT(name, ' (', COALESCE(phone, ''), ')') 避免因 phoneNULL 导致括号前全为空
  • 不能用 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_nameNULL,也输出 '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 索引

实际拼接逻辑越简单越好,复杂格式化尽量交给应用层;数据库层专注保证数据可拼、不崩、不错乱。