MySQL中CONCAT()遇NULL即返NULL;应使用IFNULL/COALESCE预处理,或改用自动跳过NULL的CONCAT_WS();字符集需统一为utf8mb4,避免乱码;WHERE/ORDER BY中慎用CONCAT()以防索引失效。

MySQL 用 CONCAT() 合并字段时为什么返回 NULL?
只要任意一个参数是 NULL,CONCAT() 就直接返回 NULL,不是空字符串。这是最常踩的坑——比如 CONCAT(first_name, ' ', last_name),只要 last_name 是 NULL,整条结果就没了。
- 用
IFNULL(col, '')或COALESCE(col, '')预处理每个可能为NULL的字段 - 别依赖字段“看起来不为空”,查一下
IS NULL真实值 - 如果只想跳过
NULL还要保留分隔符,得手动判断,CONCAT()本身不支持“忽略空值”模式
需要加空格或逗号分隔?别硬拼字符串
写成 CONCAT(name, ' ', city) 看似简单,但一旦某个字段为空或全是空格,就会出现 “张三 ” 或 “ ,北京” 这种难看格式。
- 优先用
CONCAT_WS()(W = With Separator):比如CONCAT_WS(', ', name, city, province),它自动跳过NULL值,且只在非空字段间插入分隔符 -
CONCAT_WS()第一个参数必须是分隔符(字符串),后面才是字段,顺序不能错 - 注意:它不会帮你 trim 空格,如果字段里有前导/尾随空格,得先套
TRIM()
中文、emoji 或 utf8mb4 字段合并后乱码?
不是 CONCAT() 的锅,是连接层或字段本身的字符集没对齐。常见现象:合并后显示问号、方块,或部分文字截断。
- 检查字段字符集:
SHOW CREATE TABLE your_table;确认所有参与合并的列是utf8mb4,不是utf8(MySQL 的utf8实际只支持 3 字节字符) - 检查客户端连接字符集:执行
SHOW VARIABLES LIKE 'character_set%';,重点看character_set_client和character_set_results是否为utf8mb4 - 临时修复可在查询开头加:
SET NAMES utf8mb4;,但最好从建表和连接配置源头解决
性能敏感场景下,CONCAT() 能否用于 WHERE 或 ORDER BY?
能用,但代价高——MySQL 无法有效利用索引,基本等于全表扫描。
- 例如
WHERE CONCAT(last_name, first_name) = '张三',哪怕last_name和first_name都有索引,也用不上 - 排序同理:
ORDER BY CONCAT(name, ' ', id)会强制 filesort - 真要高频按组合字段查,建生成列(Generated Column)+ 索引更靠谱:
ALTER TABLE t ADD full_name VARCHAR(100) GENERATED ALWAYS AS (CONCAT(first_name, ' ', last_name)) STORED;,再给full_name加索引
NULL 处理和字符集这两步最容易漏,一漏就是线上查不到数据或者展示异常,比语法错误还难定位。










