最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何安全地使用SQL的CONCAT函数拼接多个字段?
时间:2026-07-15 19:52:47 编辑:袖梨 来源:一聚教程网
CONCAT()遇NULL即返回NULL,非空字符串;CONCAT_WS()自动跳过NULL且首参为分隔符,更安全;分隔符不可为NULL但可为空字符串;不支持动态分隔符,需用IFNULL/COALESCE处理兜底值。
CONCAT() 遇 NULL 就返回 NULL,不是空字符串
这是最常被忽略的底层行为:MySQL 的 CONCAT() 只要任一参数为 NULL,整个结果就是 NULL,不是 ''。比如 CONCAT('a', NULL, 'c') → NULL,不是 'ac'。这会导致 WHERE 条件失效、SELECT 字段显示为空,而不是你预期的“跳过空值”。尤其在拼接 title、location 等允许为空的业务字段时,整行直接“消失”。
优先用 CONCAT_WS() 跳过 NULL,别硬套 CONCAT()
CONCAT_WS() 是更安全的默认选择——它第一个参数是分隔符,后续参数中所有 NULL 值会被自动忽略,不插空档、不中断拼接:
-
CONCAT_WS(' ', title, content, author, location):哪怕location是NULL,也会拼出'足球新闻 体育频道 张三' - 分隔符本身不能为
NULL,否则整条结果变NULL;但空字符串''是合法分隔符,会连在一起(如CONCAT_WS('', a, b)→'ab') - 不支持在分隔符位置写表达式,比如
CONCAT_WS(IFNULL(suffix, '-'), ...)会报错
必须用 IFNULL() 或 COALESCE() 的场景
当你要控制每个字段的“兜底值”(不只是空字符串),或需要兼容老版本 MySQL(
CONCAT(IFNULL(title, ''), '|', IFNULL(author, '佚名'), '(', CAST(year AS CHAR), ')')-
COALESCE()支持多 fallback,比如COALESCE(middle_name, nickname, '用户'),语义更清晰 - 数字字段直接拼接可能触发隐式二进制转换(尤其旧版 MySQL),建议统一用
CAST(col AS CHAR)
WHERE 里用 CONCAT() 会丢索引,别这么干
在 WHERE 子句里写 CONCAT(title, content) LIKE '%关键词%',数据库无法利用 title 或 content 上的索引,必然全表扫描。真正要按拼接内容检索,优先考虑:
- 建生成列并加索引:
ALTER TABLE articles ADD full_text TEXT GENERATED ALWAYS AS (CONCAT_WS(' ', title, content, author)) STORED,再对full_text加全文索引 - 应用层拼接:查出原始字段,在 PHP/Python 里组合后匹配,把计算压力从数据库移走
- 改用多字段 OR 匹配:
WHERE title LIKE ? OR content LIKE ? OR author LIKE ?,语义更准、还能走索引
IF() 和 CONCAT()。
相关文章
- 王者荣耀世界零氪玩家如何生存 07-28
- 快手极速版怎么绑定手机号 07-28
- 明日方舟和轻松小熊联动活动内容一览 07-28
- 逆战未来黎明之光 逆战未来黎明之光玩法机制与新手入门指南 07-28
- 植物大战僵尸融合版毁灭土豆地雷介绍 07-28
- 逆战未来飓风之龙 逆战未来飓风之龙武器获取方法详解 07-28