mysql中concat函数的用法

记得上次帮同事改一个报表的时候,他那个SQL拼接地址的语句写得好长,中间还因为空值出过bug。
当时我就想,这要是用CONCAT或者CONCAT_WS会不会简单点。

他那个表里,有的用户没填省,有的没填市,用CONCAT直接拼,结果就是乱码。
后来我让他用CONCAT(COALESCE(province, ''), city, COALESCE(district, '')),把NULL替换成空字符串,再拼起来。
这样就算省市区有空的,也能正常显示为“XX市XX区”,而不是直接跳过或者报错。

等等,我突然想到,其实更早之前,可能是因为数据库设计的时候没考虑到空值处理,导致后面报表展示总要返工。
所以有时候写SQL不光是技术问题,还得想是不是数据源头就有问题。

现在看CONCAT和CONCAT_WS的区别,确实CONCAT_WS更懒人一些,自动无视NULL,特别适合固定格式的拼接,比如日期或者电话号码带分隔符。
但CONCAT更灵活,可以自己决定怎么处理空值,比如用空格补位,或者用特定的占位符。

说起来,现在我们新来的实习生还在学这些基础函数,有时候还会写错参数个数,比如写成CONCAT(str),直接报错。
我就跟他说,MySQL有时候还挺“任性”的,必须按规定来。

对了,你有没有遇到过CONCAT拼接特别长的字符串,导致性能问题的场景?比如一次拼接超过2 00个字段?

mysqlgroup_concat()函数用法总结

Group_concat是MySQL拼接字符串的函数。
就是分组后,把多个值串成1 个字符串。
比如订单表,按用户分组,把订单号拼起来。
Order by子句可以排序,默认逗号分隔。
Separator自定义分隔符,比如'|'。
Distinct去重,比如拼不重复的城市名。
结果长度有1 02 4 字节限制,用系统变量改。
Group_concat_max_len=1 0000能放大。
大数据量用,内存消耗会明显。
Order by和Distinct会慢,注意优化。
自己掂量。

SQL合并字符串最佳实践 各类字符拼接函数性能分析

MySQL:少量拼接用CONCAT(),大量或带分隔符用CONCAT_WS(),分组用GROUP_CONCAT()并调整长度限制。
SQL Server:无NULL时用+,有NULL或需分组用CONCAT()/STRING_AGG()。
PostgreSQL:优先用||,分组用STRING_AGG()并指定顺序。

参数化查询,别直接拼接用户输入。
测试本地环境,验证实际性能。